简介
为nginx服务器编写的一个上传模块,能够处理传统mutipart/form-data的上传,同时支持断点续传。
为什么要使用upload module
1.简单:使用上传模块,开发中不需要再处理文件的写入,只需要在nginx配置文件中增加几行,即可实现上传的功能。
2.可靠:上传模块目前版本为2.2.0,已经相当稳定。
3.功能强大:支持断点续传。
使用upload module配置指令说明
upload_pass
文件上传结束后代理到的地址,同时将文件信息传递给此地址。
upload_resumble
是否开启续传,默认关闭
upload_store
上传文件的存放位置,文件存放路径被hash到子目录中,注意nginx不会自动创建子目录,必须使用前创建,否则会报错
upload_state_store
断点续传状态文件的存放位置,如果不配置,会与文件hash存放到一个目录下,名称为文件名.state,同上传目录一样,使用前必须创建子目录
upload_store_access
nginx user对上传文件的读写权限,默认同时拥有读写权限
upload_set_form_field
声名传递到后台的参数名和值,一个文件可使用的属性如下。
$upload_field_name:上传表单中文件所属的input输入框的name属性
$upload_content_type:文件类型
$upload_file_name:文件名
$upload_tmp_path:文件的存放路径
upload_aggregate_form_field
与upload_set_form_field指令类似,将文件上传结束后的属性传递到后台,可使用的属性如下。
$upload_file_md5:文件的md5sum值
$upload_file_md5_uc:大写形式的文件md5sum值
$upload_file_sha1:文件的sha1 sum值
$upload_file_sha1_uc:大写形式的文件sha1 sum值
$upload_file_crc32:16进制的CRC32文件校验码
$upload_file_size:文件大小,单位为bytes
$upload_file_number:文件体在请求体中的序号
upload_pass_form_field
声名被传递到后台的原表单字段,使用正则表达式
upload_cleanup
声名后台返回什么状态码时,nginx需要删除上传文件,状态码必须在400~500之间
upload_max_part_header_len
声名最大的http头长度,即buffer size
upload_max_file_size
声名允许上传的文件大小限制,官方文档解释为“软”限制,即超过此大小的文件仍将被接收,而client_max_body_size为“硬”限制。值为零表示无大小限制。
upload_limit_rate
声名最大的上传速度,0表示无限制
upload_max_output_body_len
声名最大的输出body大小,防止非file类型的输入堆积到memory,0表示无限制
upload_tame_array
参数名中的中括号是否被丢掉
配置实例
处理上传的路径为:/nginx-upload,此地址为上传表单的提交地址
文件上传完成后,nginx会将请求代理到后端,本例中为自定义的location upload,代理到的地址还是/nginx-upload,当然可以使用rewrite指令代理到例外一个地址。
后台会接收到的参数名和值自定义,在本例子中分别为name,content_type, path, md5, size, submit 和description
location ~* /nginx-upload {
upload_pass @upload;
upload_store /opt/tmp/uploads 1;
upload_resumable on;
upload_set_form_field name "$upload_file_name";
upload_set_form_field content_type "$upload_content_type";
upload_set_form_field path "$upload_tmp_path";
upload_aggregate_form_field "md5" "$upload_file_md5";
upload_aggregate_form_field "size" "$upload_file_size";
upload_pass_form_field "^submit$|^description$";
upload_cleanup 400 404 499 500-505;
}
location @upload {
proxy_pass http://web;
}