Nginx Upload Module 上传模块测试例子

传统站点在处理文件上传请求时,普遍使用后端编程语言处理,如:Java、PHP、Python、Ruby等。今天给大家介绍Nginx的一个模块,Upload Module上传模块,此模块的原理是先把用户上传的文件保存到临时文件,然后在交由后台页面处理,并且把文件的原名,上传后的名称,文件类型,文件大小set到页面。

GitHub: https://github.com/vkholodkov/nginx-upload-module/tree/2.2

Site: http://wiki.nginx.org/HttpUploadModule

一、安装模块

从GitHub上下载源码解压,进入nginx源码目录,重新./configure并且添加如下参数:

 代码如下 复制代码
// 添加此参数
--add-module=path/to/nginx_upload_module
 
// 如果你的Upload Module路径为:/home/nginx_upload_module
--add-module=/home/nginx_upload_module

如果你想获知此前nginx安装参数可以这样获取:

 代码如下 复制代码

[root@lee uploadtmp]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.5.10
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) 
TLS SNI support enabled  www.111cn.net
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/home/nginx-upload-module-2.2

配置过程中,注意查看过程是否出错

 代码如下 复制代码

configuring additional modules
adding module in /home/nginx-upload-module-2.2
 + ngx_http_upload_module was configured

如果没有什么错直接就make && make install完事

二、配置

直接来个样例:

 代码如下 复制代码

# 上传大小限制(包括所有内容)
client_max_body_size 100m;
 
# 上传path配置
location /upload {
    # 转到后台处理URL
    upload_pass   /uploadHandle;
 
    # 临时保存路径
    # 可以使用散列
    upload_store /tmp/nginx_upload;
     
    # 上传文件的权限,rw表示读写 r只读
    upload_store_access user:rw;
 
    # 这里写入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 "^submit$|^description$";
 
    # 每秒字节速度控制,0表示不受控制,默认0
    upload_limit_rate 0;
 
    # 如果pass页面是以下状态码,就删除此次上传的临时文件
    upload_cleanup 400 404 499 500-505;
}

上配置中,仅是一些常用配置,更全的配置请看Nginx Upload Module的site

三、测试

我利用实例中的example.php测试处理结果:

连中文名都被识别set过来了

四、一些建议

效率对比,此模块是由C语言写的,效率自然不成问题,另外一个有点是不会过多占用后台语言的线程。相比之下,Nginx利用负债均衡的能力处理文件上传上,效率更高。

权限控制,这个确实蛋疼,因为业务代码在nginx.conf里写太多反倒不好维护,但如果不考虑权限的情况下,并且file size 控制的小一点,结合upload_cleanup不会有太大压力。

上传进程,可以结合Nginx的nginx_uploadprogress_module使用

存储位置,甚至可以把临时文件保存到tmpfs中(不过这会有丢失的可能性)

五、nginx upload module配置参数

upload_pass 指明后续处理的php地址。文件中的字段将被分离和取代,包含必要的信息处理上传文件。

upload_resumable 是否启动可恢复上传。

upload_store 指定上传文件存放地址(目录)。目录可以散列,在这种情况下,在nginx启动前,所有的子目录必须存在。

upload_state_store 指定保存上传文件可恢复上传的文件状态信息目录。目录可以散列,在这种情况下,在nginx启动前,所有的子目录必须存在。

upload_store_access 上传文件的访问权限,user:r是指用户可读

upload_pass_form_field 从表单原样转到后端的参数,可以正则表达式表示。:

$upload_field_name — 原始文件中的字段的名称

upload_pass_form_field “^submit$|^description$”;

意思是把submit,description这两个字段也原样通过upload_pass传递到后端php处理。如果希望把所有的表单字段都传给后端可以用upload_pass_form_field “^.*$”;

upload_set_form_field 名称和值都可能包含以下特殊变量:

$upload_field_name 表单的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 文件大小

$upload_file_number 请求体中的文件序号

这些字段值是在文件成功上传后计算的。

upload_cleanup 如果出现400 404 499 500-505之类的错误,则删除上传的文件

upload_buffer_size 上传缓冲区大小

upload_max_part_header_len 指定头部分最大长度字节。

upload_max_file_size 指定上传文件最大大小,软限制。client_max_body_size硬限制。

upload_limit_rate 上传限速,如果设置为0则表示不限制。

upload_max_output_body_len 超过这个大小,将报403错(Request entity too large)。

upload_tame_arrays 指定文件字段名的方括号是否删除

upload_pass_args 是否转发参数。

时间: 2024-10-26 19:35:46

Nginx Upload Module 上传模块测试例子的相关文章

nginx上传模块—nginx upload module

nginx上传模块 一. nginx upload module原理 官方文档: http://www.grid.net.ru/nginx/upload.en.html Nginx upload module通过nginx服务来接受用户上传的文件,自动解析请求体中存储的所有文件上传到upload_store指定的目录下.这些文件信息从原始请求体中分离并根据nginx.conf中的配置重新组装好上传参数,交由upload_pass指定的段处理,从而允许处理任意上传文件.每个上传文件中的file字段

nginx安装文件上传ngx

  ngx_upload模块是nginx中一个文件上传模式了,下面我们来看看nginx安装文件上传ngx_upload模块步骤,希望例子对各位有帮助. 安装nginx,并加入nginx upload module和nginx cache purge module: mkdir ~/download cd ~/download wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.0.12.tar.gz tar zxf n

nginx upload module的使用

现在的网站,总会有一点与用户交互的功能,例如允许用户上传头像,上传照片,上传附件这类的.PHP写的程序,对于上传文件效率不是很高.幸好,nginx有一个名为upload的module可以解决这个问题.网络上已经有很多关于upload module的文章,但是大部分都是介绍编译安装这些的,对于一些细节叙述不是很清楚,于是自己写了这篇.参考了很多其他人的文档,在此致谢,详细见参考文档部分. 一.upload module的工作原理nginx upload module模块通过nginx服务器来接受用

php文件上传的例子及参数详解

 这篇文章主要介绍了php文件上传的例子及参数,有需要的朋友可以参考一下 1.上传表单 upload.html   程序代码 HTML     代码如下: <form enctype="multipart/form-data" action="upload.php" method="post">   <input type="hidden" name="max_file_size" val

多文件上传的例子_php基础

多文件上传的例子 //upload_html.php--------------------------------------------------------------------------------------------- <HTML> <HEAD> <TITLE>上传文件</TITLE> </HEAD> <script> function beforesubmit(forma) {    var indexnamea

Doctrine文件上传处理例子

基本设置 创建一个简单的Doctrine实体类: // src/Acme/DemoBundle/Entity/Document.php namespace Acme\DemoBundle\Entity;   use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert;   /**  * @ORM\Entity  */ class Document {     /**      * @

多文件上传的例子

多文件上传的例子//upload_html.php--------------------------------------------------------------------------------------------- <HTML> <HEAD> <TITLE>上传文件</TITLE> </HEAD> <script> function beforesubmit(forma) {    var indexnamea=

java-使用jspsmart.upload组件上传文件总是上传不上,跪求指点

问题描述 使用jspsmart.upload组件上传文件总是上传不上,跪求指点 JSP body区: <% SmartUpload su=new SmartUpload(); su.initialize(pageContext); su.upload(); int num=su.save("/file/", SmartUpload.SAVE_VIRTUAL); out.println(num+"个文件上传成功!!!"); %> 已经把组件的包导进去了 &

jQuery File Upload文件上传插件使用详解_jquery

jQuery File Upload 是一个Jquery文件上传组件,支持多文件上传.取消.删除,上传前缩略图预览.列表显示图片大小,支持上传进度条显示:支持各种动态语言开发的服务器端. 官网链接:https://github.com/blueimp/jQuery-File-Upload/wiki 特点:拖放支持:上传进度条:图像预览:可定制和可扩展的:兼容任何服务器端应用平台(PHP, Python, Ruby on Rails, Java, Node.js, Go etc.). 使用方法: