文档章节

nginx上传模块---nginx upload module

小运
 小运
发布于 2014/03/23 01:20
字数 1434
阅读 765
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

nginx上传模块 一. nginx upload module原理 官方文档: http://www.grid.net.ru/nginx/upload.en.html Nginx upload module通过nginx服务来接受用户上传的文件,自动解析请求体中存储的所有文件上传到upload_store指定的目录下。这些文件信息从原始请求体中分离并根据nginx.conf中的配置重新组装好上传参数,交由upload_pass指定的段处理,从而允许处理任意上传文件。每个上传文件中的file字段值被一系列的upload_set_form_field指令值替换。每个上传文件的内容可以从$upload_tmp_path变量读取,或者可以将文件转移到目的目录下。上传的文件移除可以通过upload_cleanup指令控制。如果请求的方法不是POST,模块将返回405错误(405 Not Allowed),该错误提示可以通过error_page指令处理。 具体的过程如下: 1. 用户访问能够选择上传文件的页面 2. 用户提交表单 3. 浏览器把文件和有关文件的信息作为请求的一部分发送给服务器 4. 服务器把文件保存到临时存储目录下upload_store 5. upload_pass指定的处理表单提交的php页面将文件从upload_store拷贝到持久存储位置 二.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 是否转发参数。 三. nginx配置 # wget http://www.nginx.org/download/nginx-1.2.2.tar.gz # wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz # tar zxvf nginx_upload_module-2.2.0.tar.gz -c ../software/ # tar zxvf nginx_upload_module-2.2.0.tar.gz -C ../software/ # ./configure --prefix=/usr/local/nginx --add-module=../nginx_upload_module-2.2.0 --with-http_secure_link_module # make # make install # vi nginx.conf user www-data; worker_processes 20; error_log logs/error.log notice; working_directory /usr/local/nginx; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; root /www/web/upload; server { listen 80; server_name 192.168.41.129;   error_page 405 =200 @405; //处理405错误 location / { index index.html index.htm index.php; } location @405 { root /www/web/upload; } location ~ \.php$ { try_files $uri /404.html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include /etc/nginx/fastcgi_params; } client_max_body_size 100m; # 上传页面提交到这个location location /upload { # 文件上传以后转交给后端的php代码处理 upload_pass @test ; # 上传文件的临时存储位置,目录是散列的,应该存在子目录0 1 2 3 4 5 6 7 8 9 upload_store /www/web/upload/tmp 1; 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$"; upload_pass_args on; } # 将请求转到后端的地址处理 location @test { rewrite ^(.*)$ /test.php last; } } } 四. 上传界面 # cat /www/web/upload/upload.html <html> <head> <title>Test upload</title> </head> <body> <h2>Select files to upload</h2> <form enctype="multipart/form-data" action="/upload" method="post"> <input type="file" name="file1"><br> <input type="file" name="file2"><br> <input type="file" name="file3"><br> <input type="file" name="file4"><br> <input type="file" name="file5"><br> <input type="file" name="file6"><br> <input type="submit" name="submit" value="Upload"> <input type="hidden" name="test" value="value"> </form> </body> </html> 五. upload_pass处理内容 # cat test.php //这里只是简单的打印出来,便于先理解上传原理。请对着输出内容理解下nginx upload module配置参数。 <?php print_r($_POST); ?> 对上传文件的处理请参考:http://cn.php.net/manual/en/features.file-upload.php 六. 测试 http://192.168.41.129/upload.html 输出内容如下所示: Array ( [file1_name] => Learning Perl, Sixth Edition.pdf [file1_content_type] => application/pdf [file1_path] => /www/web/upload/tmp/4/0000000014 [file1_md5] => 87032cc58109f5c6bb866d2684f9b48c [file1_size] => 8927511 [file2_name] => Programming Perl, 4th Edition.pdf [file2_content_type] => application/pdf [file2_path] => /www/web/upload/tmp/5/0000000015 [file2_md5] => 82a52df177a8912c06af276581cfd5e4 [file2_size] => 21146356 [submit] => Upload ) 注意:需要修改php.ini以下参数 file_uploads on 是否允许通过http上传 upload_max_filesize 8m 允许上传文件的最大大小 post_max_size 8m 通过表单POST给php所能接收的最大值 另外nginx.conf中设置上传文件大小 upload_max_file_size 软限制 client_max_body_size 硬限制
小运
粉丝 103
博文 761
码字总数 659803
作品 0
福州
系统管理员
私信 提问
加载中
请先登录后再评论。
记一次失败的Perl + Nginx + FastCGI 配置过程

这两天心血来潮,不知道为什么和 Perl + Nginx + FastCGI 配置 耗上了。但是失败了,记录如下: 1)安装Nginx 1.4.3 ,我的是WINDOWS 7 系统,修改配置文件如下: location ~ .(pl|cgi|perl)?...

通吃岛-低手哥
2013/10/27
1.6K
7
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.1K
3
基于 ThinkPHP 的内容管理系统--歪酷CMS

歪酷网站管理系统(歪酷CMS)是一款基于THINKPHP框架开发的PHP+MYSQL网站建站程序,本程序实现了文章和栏目的批量动态管理,支持栏目无限分类,实现多管理员管理,程序辅助功能也基本实现了常见的文...

鲁大在线
2013/02/19
7K
1
Web 的 SSH 控制台--KeyBox

KeyBox 是一个基于 Web 的 SSH 控制台,用于同步管理多个系统并且可执行远程命令。允许你共享终端命令并上传文件到所有系统。但连接会话打开时你可选择在其中一个终端或者多个终端上执行命令...

匿名
2013/02/28
8.3K
0
Steam Installer for Wheezy

Linux游戏最近因为Valve旗下Steam平台的支持而获得快速增长。最初Steam只承诺支持最流行的桌面发行版Ubuntu,但最近它已向其它流行发行版开放了大门。但如果你使用的是不那么流行的发行版呢?...

匿名
2013/03/06
862
0

没有更多内容

加载失败,请刷新页面

加载更多

禁用win10无用服务,提高Win10系统游戏性能!

长按二维码关注网络杀手 分享有态度的最好应用 分享干货满的学习教程 网络杀手 公众号的发展离不开大家的支持,非常感谢各位的关注!小编以后会继续努力加油,为大家分享更多更好的教程和应用...

whiteshds
40分钟前
5
0
聊聊dubbo-go的forkingCluster

序 本文主要研究一下dubbo-go的forkingCluster forkingCluster dubbo-go-v1.4.2/cluster/cluster_impl/forking_cluster.go type forkingCluster struct{}const forking = "forking"func......

go4it
43分钟前
13
0
如何在Vim中进行不区分大小写的搜索 - How to do case insensitive search in Vim

问题: I'd like to search for an upper case word, for example COPYRIGHT in a file. 我想搜索大写单词,例如文件中的COPYRIGHT。 I tried performing a search like: 我尝试过执行搜索:......

富含淀粉
今天
17
0
Flutter+FaaS一体化任务编排的思考与设计

简介: 闲鱼flutter faas一体化提升研发体验+研发质量 作者:闲鱼技术-古风 Flutter+Serverless三端一体研发架构,客户端不仅仅是编写双端的代码,而是扩展了客户端的工作边界,形成完整的业...

一肥仔
今天
21
0
lodash和下划线之间的差异[关闭] - Differences between lodash and underscore [closed]

问题: Why would someone prefer either the lodash.js or underscore.js utility library over the other? 为什么有人更喜欢lodash.js或underscore.js实用程序库而不是另一个? Lodash see......

fyin1314
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部