准备工作
现在nginx-upload-module模块已经加入到Nginx,但还不能直接使用,还有一些准备工作要做。
准备JavaScript脚本
首先,下载或直接链接jQuery.js,因为模块要配合使用jQuery来控制HTML元素显示进度。
...
...
或
...
...
关键是还需要另一个脚本:jquery.uploadProgress.js。可以从这里下载。
注意
别忘了在你的页面中包含该脚本。
同样滴,由于jQuery已经变化,不再支持$.browser.safari,所以我们需要修改jquery.uploadProgress.js。
将所有这样的代码:
$.browser.safari
修改成:
navigator.userAgent.match(/safari/i)
该修正参考自这里,原意是针对IE的,可以依样画葫芦。
原文这么说:
...
as far of jquery 1.9 jQuery.browser was removed, adn admin_menu get this error:
"Uncaught TypeError: Cannot read property 'msie' of undefined" (admin_menu.js - line:223)
For quick fix use this code:
change line 223:
- if ($.browser.msie && parseInt(jQuery.browser.version) == 6) {
+ if (navigator.userAgent.match(/msie [6]/i)) {
...
修改Nginx配置文件
首先要修改/etc/nginx.conf文件,加大允许上传的文件尺寸,并配置上传进度报告的尺寸间隔,这里设置为50k一报告。
http {
##
# Basic Settings
##
...
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
# REV:igame@Dec-22-2013: Change size from 2m to 256m.
client_max_body_size 256M;
# REV:igame@Dec-22-2013: Followed the instruction of http://wiki.nginx.org/HttpUploadProgressModule
upload_progress proxied 50k;
...
再修改/etc/nginx/sites-available/default文件中的location ~ .php$小节,根据指南,track_uploads必须是最后一行。
location ~ \.php$ {
...
# track uploads in the 'proxied' zone
# remember connections for 30s after they finished
track_uploads proxied 30s;
}
并添加下面的内容:
location ^~ /progress {
upload_progress_json_output;
report_uploads proxied;
}
使用upload_progress_json_output是因为jQuery会按json模式解析数据,不加这一行将导致解析失败,也就不能显示进度了。
修改PHP配置
打开/etc/php5/fpm/php.ini文件,修改以下内容:
...
; Whether to allow HTTP file uploads.
; http://php.net/file-uploads
file_uploads = On
...
;post_max_size = 8M
post_max_size = 256M
...
; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
;upload_max_filesize = 2M
upload_max_filesize = 256M
...
允许文件上传,并允许上传最大256M的文件。如果文件太小了,一忽儿就完毕了,也就无法看到进度了。
编写页面
现在编写上传页面,假设叫learn.php,内容如下:
注意
该页面可能不能在你的机器上运行,因为脚本路径与你的实际情况不一致。
再编写上传完成后的页面,假设名字叫ulfile.php,内容如下:
";
if ($_FILES["file1"]["error"] > 0)
{
echo "Error:" . $_FILES["file1"]["error"] . "
";
}
else
{
echo "Source File: " . $_FILES["file1"]["name"] . "
";
echo "Type: " . $_FILES["file1"]["type"] . "
";
echo "Size: " . round($_FILES["file1"]["size"] / 1024) . " kB
";
echo "Stored in: " . $_FILES["file1"]["tmp_name"];
echo "
";
$uploaddir = './upload/'; // /usr/share/nginx/www/upload/';
// 注意,英文文件名不需要解码,但中文需要。
// $uploadfile = $uploaddir . basename($_FILES['file1']['tmp_name']);
$uploadfile = $uploaddir . html_entity_decode(basename($_FILES['file1']['name']));
echo "Destination:" . $uploadfile . "
";
if (move_uploaded_file($_FILES['file1']['tmp_name'], $uploadfile))
{
echo "File successfully uploaded.
";
/* 如果不想保存,只是测试进度条,可以在上传完成后立即删除。
if (!unlink($uploadfile))
echo "Can't delete the uploaded file.
";
*/
}
else
echo "Failed to save file.
";
}
}
注意,如果遇到目录问题,比如这里使用upload目录,而你没有,你需要建立这样的目录并设置相当权限(root)。
好了,现在可以心情的享受你的上传进度条了,小心不要爆了你的硬盘。
Tips
问题主要集中在路径上,比如js的路径,目录的权限,致命的413错误等。