使用 Nginx Upload Module 实现上传文件功能

李鹏0 1,771 次浏览

Nginx有一个Upload模块,可以非常简单的实现文件上传功能。此模块的原理是先把用户上传的文件保存到临时文件,然后在交由后台页面处理,并且把文件的原名,上传后的名称,文件类型,文件大小set到页面

Nginx配置

Nginx upload module的简单配置如下:

server {
    listen *:80 default_server;
    server_name 192.168.1.251;
    client_max_body_size 20m;
    client_body_buffer_size 512k;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE_ADD $remote_addr;
    location /upload {
	# 转到后台处理URL,表示Nginx接收完上传的文件后,然后交给后端处理的地址
	upload_pass @python;
	# 临时保存路径, 可以使用散列
	# 上传模块接收到的文件临时存放的路径, 1 表示方式,该方式是需要在/tmp/nginx_upload下创建以0到9为目录名称的目录,上传时候会进行一个散列处理。
	upload_store /tmp/nginx_upload;
	# 上传文件的权限,rw表示读写 r只读
	upload_store_access user:rw group:rw all:rw;
	set $upload_field_name "file";
	# upload_resumable on;
	# 这里写入http报头,pass到后台页面后能获取这里set的报头字段
	upload_set_form_field "${upload_field_name}_name" $upload_file_name;
	upload_set_form_field "${upload_field_name}_content_type" $upload_content_type;
	upload_set_form_field "${upload_field_name}_path" $upload_tmp_path;
	# Upload模块自动生成的一些信息,如文件大小与文件md5值
	upload_aggregate_form_field "${upload_field_name}_md5" $upload_file_md5;
	upload_aggregate_form_field "${upload_field_name}_size" $upload_file_size;
	# 允许的字段,允许全部可以 "^.*$"
	upload_pass_form_field "^.*$";
	# upload_pass_form_field "^submit$|^description$";
	# 每秒字节速度控制,0表示不受控制,默认0, 128K
	upload_limit_rate 0;
	# 如果pass页面是以下状态码,就删除此次上传的临时文件
	upload_cleanup 400 404 499 500-505;
	# 打开开关,意思就是把前端脚本请求的参数会传给后端的脚本语言,比如:http://192.168.1.251:9000/upload/?k=23,后台可以通过POST['k']来访问。
	upload_pass_args on;  
    }
    location @python {
	proxy_pass http://localhost:9999;
	# return 200;  # 如果不需要后端程序处理,直接返回200即可
    }
}


具体后端处理自行解决。


发表评论

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen