我编写了一个非常基本的上传脚本,它接收文件并使用标准的move_uploaded_file方法上传它,如下所示:
//UPLOAD IMAGE
$path = "../../clients/$realClient/" . $_FILES["image"]["name"][$x];
move_uploaded_file($_FILES["image"]["tmp_name"][$x], $path);
$displayPath = "private/clients/$realClient/" . $_FILES["image"]["name"][$x];
mysql_query("INSERT INTO images VALUES(NULL, '$displayPath', '$client', '$project', '$newWeight')") or die("Unable to Insert Image - Please Try Again");
echo "File Successfully Uploaded<br />";
此上传脚本适用于大多数用途。这是我的问题:
我有一个标准的共享托管软件包,因此有时当用户尝试上传需要超过五分钟上传的文件(例如视频或其他高分辨率媒体)时,服务器会超时。托管公司说,由于它是一个共享托管服务器,他们不愿意为我增加超时限制。
是否有更高效的上传脚本,允许文件在五分钟内上升,或者是否有可能建议的替代方案?
干杯, 丹
答案 0 :(得分:2)
上传完成后,运行PHP脚本;因此,如果在上传过程中出现超时,则您无法在脚本中执行任何操作(因为它根本不会运行)。
如果在脚本期间发生超时,您可以将其拆分为多个部分 - 让第一个脚本只存储上传的文件,将HTTP重定向到另一个脚本,这将执行处理和数据库工作。在您正在显示的脚本中,处理看起来很简单,不确定分割 是否会有所帮助。
假设您只展示了简化版本:
script1.php
// upload is complete
$fname= basename($_FILES["image"]["name"][$x]); //prevent directory traversal
$uniqid = uniqid("",true);
$path = "../../clients/$realClient/temporary/" . $uniqid . '/' . $fname;
// move to temporary location and redirect
move_uploaded_file($_FILES["image"]["tmp_name"][$x], $path);
header('Location: /script2.php?file=' . $uniqid . '/' . $fname);
script2.php
$path = $_GET['file'];
$uniqid = basename(dirname($path));
$fname = basename($path);
$temp_path = "../../clients/$realClient/temporary/" . $uniqid . '/' . $fname;
$final_path = "../../clients/$realClient/" . $fname;
move($temp_path,$final_path);
// do whatever processing is necessary
mysql_query("INSERT INTO images VALUES(NULL, '$displayPath', '$client', '$project', '$newWeight')") or die("Unable to Insert Image - Please Try Again");
echo "File Successfully Uploaded<br />";