在Nginx网站的模块列表页中发现一个Nginx服务器的上传模块http://www.grid.net.ru/nginx/upload.en.html
该模块通过Nginx服务器来接受用户上传的文件,在Nginx接受完文件以后再转给后端的程序做处理。
它自动分析客户端的上传请求,将上传的文件保存到 upload_store 所指向的目录位置. 然后这些文件信息将被从原始的请求中剔除,重新组装好上传参数后转到后端由 upload_pass 指定的位置去处理,这样就可以任意处理上传的文件。
每一个上传的 file 字段值将可以由upload_set_form_field 指定的值替换. 文件的内容可以由$upload_tmp_path 变量读到或简单的移到其他位置. 将文件删除由 upload_cleanup 指定控制。
upload_set_form_field可以使用的几个变量
$upload_field_name
原始的文件字段
$upload_content_type
上传文件的类型
$upload_file_name
客户端上传的原始文件名称
$upload_tmp_path
上传的文件保存在服务端的位置
upload_aggregate_form_field 可以多使用的几个变量,文件接收完毕后生成的
$upload_file_md5
文件的MD5校验值
$upload_file_md5_uc
大写字母表示的MD5校验值
$upload_file_sha1
文件的SHA1校验值
$upload_file_sha1_uc
大写字母表示的SHA1校验值
$upload_file_crc32
16进制表示的文件CRC32值
$upload_file_size
文件大小
官方的设置举例
server { client_max_body_size 100m; listen 80; # 上传表单应该提交到这个地址 location /upload { # 将请求体转到这个位置 upload_pass /test; # 将上传的文件保存到这个目录下 # 目录是被散列化的,应该存在子目录 0 1 2 3 4 5 6 7 8 9 upload_store /tmp 1; # 允许上传的文件被用户 user 只读 upload_store_access user:r; # 设置请求体的字段(添加自己后端处理的信息) 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; # 指示后端关于上传文件的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 "^submit$|^description$"; } # 将请求转到后端的地址处理 location /test { proxy_pass http://localhost:8080; } }
将模块添加到Nginx中的方法
下载源代码解压后
为nginx配置额外模块(需要重新编译):
tar xvzf nginx_upload_module-2.0.7.tar.gz cd nginx631 ./configure –add-module=/usr/local/nginx_upload_module-2.0.7 make make install
大概解释一下每个参数
upload_pass 指明了需要后续处理的地址
upload_cleanup 如果出现400 404 499 500-505之类的错误,则删除上传的文件
upload_store 上传文件存放地址
upload_store_access 上传文件的访问权限,user:r是指用户可读
upload_limit_rate 上传限速,如果设置为0则表示不限制
upload_set_form_field 设定额外的表单字段。这里有几个可用的变量:
$upload_file_name 文件原始名字
$upload_field_name 表单的name值
$upload_content_type 文件的类型
$upload_tmp_path 文件上传后的地址
upload_aggregate_form_field 额外的变量,在上传成功后生成
$upload_file_md5 文件的MD5校验值
$upload_file_size 文件大小
upload_pass_form_field 从表单原样转到后端的参数,可以正则表达式表示官方的例子是upload_pass_form_field "^submit$|^description$";意思是把submit,description这两个字段也原样通过upload_pass传递到后端处理。如果希望把所有的表单字段都传给后端可以用upload_pass_form_field "^.*$";