PDA

View Full Version : Remote Uploader



IamOverlord
دوشنبه 05 تیر 1391, 14:13 عصر
سلام دوستان...
می خوام یه کد بنویسم برای آپلود فایل، اما درصد انجام کار دیده بشه مثلا داخل یه تگ <p></p>؛
ترجیحا می خوام کارا داخل یه فایل php باشه.
تا یه جایی کدشو نوشتم. اگه می شه کمک کنید تا کامل شه. باید از AJAX استفاده کنم؟ می شه بگید کلا باید چی کار کنم؟ ایده ای دارید؟ توضیحی...؟
فعلا کاربرپسندی کار مهم نیست.


<?php
if (empty($_REQUEST)){
//submit file info and ready to go!
echo '<html>', PHP_EOL;
echo '<head>', PHP_EOL;
echo '<title>upload.php</title>', PHP_EOL;
echo "<script type='text/javascript'>", PHP_EOL;
echo "", PHP_EOL;
echo "", PHP_EOL;
echo "", PHP_EOL;
echo "</script>", PHP_EOL;
echo '</head>', PHP_EOL;
echo '<body>', PHP_EOL;
echo "<form action='upload.php?function=upload' method='get'>", PHP_EOL;
echo "<input type='text' name='url' />", PHP_EOL;
echo "<input type='submit' name='submit' value='Upload' />", PHP_EOL
echo '</form>', PHP_EOL;
echo "<p id='progress'>0</p>", PHP_EOL;


echo '</body>', PHP_EOL;
echo '</html>', PHP_EOL;

}else{
//upload file / get downloading file info
$function = $_REQUEST['function'];
switch($function){
$url = $_REQUEST['url'];
$path_parts = pathinfo($url);
$filename = $path_parts['filename'];
case 'upload':
copy($url,$filename);
break;
case 'getinfo':
$dfilesize = filesize($filename);
$sfilesize = retrieve_remote_file_size($url);
$progress = $dfilesize / $sfilesize * 100;
echo progress;
break;
}
}

function retrieve_remote_file_size($url){
$ch = curl_init($url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, TRUE);

$data = curl_exec($ch);
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);

curl_close($ch);
return $size;
}

?>

ayub_coder
دوشنبه 05 تیر 1391, 14:34 عصر
شما با Ajax نی تونید فایل آپلود کنید
برای اینکار بیشتر از Flash استفاده میکنند.(تا جایی که من میدونم)
برای نمونه می تونید این رو ببینید
uploadify.com

IamOverlord
دوشنبه 05 تیر 1391, 14:51 عصر
سلام.
منظورم اینه که با AJAX درصد پیشرفت رو ببینیم. ضمنا از کامپیوتر خودمون آپلود نمی کنیم و باید درصد پیشرفت رو از سرور بپرسیم. درصد پیشرفت رو "حجم دانلود شده تقسیم بر حجم کل ضرب در صد" در نظر می گیریم. اون کدی هم که داشتم می نوشتم بر این اساس بود... اگه می شه کمک کنین کامل کنمش...

IamOverlord
دوشنبه 05 تیر 1391, 15:38 عصر
یه چیز دیگه به ذهنم رسید، به جای این که با AJAX درصد پیشرفت کار رو از سرور بپرسیم، می تونیم خودمون درصد پیشرفت کار رو با چک کرد حجم فایل مقصد با داشتن URL اش به دست بیاریم...

ayub_coder
دوشنبه 05 تیر 1391, 15:44 عصر
موقع آپلود فایل اون فایل مستقیما که وارد همون شاخه که شما تعیین کردید آپلود نمیشه که. اول ریخته میشه تو پوشه temp و شما اون رو از پوشه Temp میریزید داخل یه پوشه دیگه. تا موقعی که آپلود شما تموم شه به حجم فایل آپلود شده دسترسی نداری مگر اینکه فایل تمپ را پیدا و اندازه رو محاسبه و به سرور دومی ارسال کنی.

IamOverlord
دوشنبه 05 تیر 1391, 17:45 عصر
سلام.
فکر کنم این حرف شما، در مورد دستور ()copy درست باشه...
چون من با همون کدی که گذاشتم امتحان کردم و دیدم در حین آپلود مقداری از اون فایل در آدرس مقصد وجود داره؛ پس اون کاری که گفتم رو فکر کنم بشه به کمک اون کدی که گذاشتم انجام داد...

ayub_coder
دوشنبه 05 تیر 1391, 18:11 عصر
بله درسته. شما تو ای حالتی که گفتید فایلی آپلود نمیکنید. بلکه دارید اون رو برروی سرورتون دانلود میکنید. اگه اینطور باشه شدنیه. با ایجکس. شما مثلا هر چند ثانیه یکبار یه صفحه که حجم فایل دانلود شده رو بخونه رو فراخوانی مکنی و نتیجه رو تو صفحه نمایش میدی.

IamOverlord
دوشنبه 05 تیر 1391, 18:54 عصر
خوب من سعی کردم اینو بنویسم:
<html>
<head>
<title>upload.php</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script language='javascript' type="text/javascript">
alert('2e2e');
function do_upload()
{
alert('it works...!');
var source_url=document.getElementById('url').value;
//ajax request for remote upload
$.ajax({
type: "POST",
url: "http://ektoplazm.ir/files/upload2.php",
data: { url: source_url, submit: "Upload" }
}).done(function( msg ) {
alert( "Data Saved: " + msg );
});
//continue : update upload status
setInterval('update_upload_status()',512);
}

function update_upload_status(){
alert('upload is starting...');
var source_url=document.getElementById('url').value;
var destination_url=source_url.substring(source_url.la stIndexOf('/')+1);
var sfilesize;
var dfilesize;
var request;

request = $.ajax({
type: "HEAD",
url: $("#"+source_url).val(),
success: function () {
sfilesize=request.getResponseHeader("Content-Length"));
}

request = $.ajax({
type: "HEAD",
url: $("#"+destination_url).val(),
success: function () {
dfilesize=request.getResponseHeader("Content-Length"));
}

var progress=dfilesize/sfilesize*100;
if (progrss==100){
document.getElementById('progress').innerhtml='don e!';
}else{
document.getElementById('progress').innerhtml=prog ress;
}


}


</script>
</head>
<body>
<form action='' method="post">
<input name="url" size="50" />
<input name="upload" type="button" value='upload' onclick="javascript:do_upload();" />
</form>
<p id='progress'>progress</p>
</body>
</html>
<?php

// maximum execution time in seconds
set_time_limit (24 * 60 * 60);

if (!isset($_POST['submit'])) die();

// folder to save downloaded files to. must end with slash
$destination_folder = '';

$url = $_POST['url'];
$newfname = $destination_folder . basename($url);

echo $url;

$file = fopen ($url, "rb");
if ($file) {
$newf = fopen ($newfname, "wb");

if ($newf)
while(!feof($file)) {
fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
}
}

if ($file) {
fclose($file);
}

if ($newf) {
fclose($newf);
}

?>

اما نمی دونم چرا کار نمی کنه... کد جاوااسکریپتش اصلا اجرا نمی شه...

IamOverlord
سه شنبه 06 تیر 1391, 19:28 عصر
فهمیدم مشکل از این قسمت در تابع ()update_upload_status هست:
request = $.ajax({
type: "HEAD",
url: $("#"+source_url).val(),
success: function () {
sfilesize=request.getResponseHeader("Content-Length"));
}

request = $.ajax({
type: "HEAD",
url: $("#"+destination_url).val(),
success: function () {
dfilesize=request.getResponseHeader("Content-Length"));
}