nginx上传模块—nginx upload module-
一. 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拷贝到持久存储位置
P.S.
安装编译方法
1.下载
|
1
|
wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz |
2.编译(在NGINX编译目录执行以下命令, 其中 --add-module=你下载解压的上传插件目录)
|
1
2
|
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --add-module=/data/downfile/nginx_upload_module-2.2.0 |
二.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配置
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#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.confuser 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 9upload_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
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<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 硬限制
nginx上传模块—nginx upload module-的更多相关文章
- nginx上传模块nginx_upload_module和nginx_uploadprogress_module模块进度显示,如何传递GET参数等。
ownload:http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gzconfigure and make : . ...
- 解决nginx上传模块nginx_upload_module传递GET参数
解决nginx上传模块nginx_upload_module传递GET参数的方法总结 最近用户反映我们的系统只能上传50M大小的文件, 希望能够支持上传更大的文件. 很显然PHP无法轻易实现大文件上传 ...
- nginx上传模块nginx_upload_module使用
1.安装模块 1 cd /data/software 2 wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.0.12.t ...
- luajit+nginx+上传模块+lua模块编译安装
git clone https://github.com/fdintino/nginx-upload-module.git git clone https://github.com/openresty ...
- Nginx Upload Module 上传模块
传统站点在处理文件上传请求时,普遍使用后端编程语言处理,如:Java.PHP.Python.Ruby等.今天给大家介绍Nginx的一个模块,Upload Module上传模块,此模块的原理是先把用户上 ...
- Nginx的Upload上传模块
前段时间做一个项目,需要上传文件,差不多需要20M左右,普通用php处理会比较麻烦,经常超时,而且大量占用资源.于是搜索了下,决定用nginx的upload上传模块来处理. 你可以在这里:http:/ ...
- nginx上传目录配置,禁止执行权限
我们经常会把网站的图片文件上传目录设置为只可上传文件但不能执行文件,就是要禁止执行权限,小编来给大家举一个上传目录配置,禁止执行权限方法,各位可参考. 如果不让有执行权限最简单的办法 代码如下 复制 ...
- nginx上传文件时 nginx 413 Request Entity Too Large 错误
产生原因: 上传文件的大小超出了 Nginx 允许的最大值,默认是1M: 解决方法: 修改Nginx的配置文件(一般是:nginx/nginx.conf),在 http{} 段中增大nginx上传文件 ...
- 基于SpringBoot从零构建博客网站 - 设计可扩展上传模块和开发修改头像密码功能
上传模块在web开发中是很常见的功能也是很重要的功能,在web应用中需要上传的可以是图片.pdf.压缩包等其它类型的文件,同时对于图片可能需要回显,对于其它文件要能够支持下载等.在守望博客系统中对于上 ...
随机推荐
- nginx+keepalived+tomcat之tomcat性能调优
body{ font-family: Nyala; font-size: 10.5pt; line-height: 1.5;}html, body{ color: ; background-color ...
- 通过yocto给p1010rdb定制linux,并启动linux
一.通过yocto定制linux 1.安装yocto yocto只能在非root用户下编译,所以先新建一个用户. useradd chen passwd -d chen 重启电脑进入chen用户. ...
- 三星S5驱动安装
三星S5的驱动安装一定要先用原装的数据线链接电脑,在电脑里面安装完驱动之后,以后才能每次都用正常的数据线链接 不然的话会提示某些驱动安装不正常..
- SqlConnection类
一.常用属性 ConnectionString 获取或设置用于打开 SQL Server 数据库的字符串. (重写 DbConnection.ConnectionString.) Connectio ...
- 【转】ARM交叉编译工具链
原文网址:http://www.veryarm.com/cross-tools 为什么要用交叉编译器? 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台( ...
- LeeCode-Single Number II
Given an array of integers, every element appears three times except for one. Find that single one. ...
- django项目环境搭建备忘
由于使用python3,所以尽量为每个项目配置虚拟环境来管理各个项目的=. 新建一个项目文件夹,进入该路径 python3 -m venv ll_env 然后激活虚拟环境 source ll_env/ ...
- VS2015 MVC5项目部署
刚看到一个年初的一个帖子说VS2015新建的MVC5项目部署后报错,自己捣鼓了一下,发现是Roslyn编译器的错误,简单处理后运行成功,分享如下: 新建一个MVC5的项目,保持不要动,执行以下几个步骤 ...
- 通过dataflow导入customer
本文在Magento ver.1.9.1.1上测试通过 (1)在配置文件中设置对应的选项.如果是多website,记得选择相应的website下的store.如果没有添加新的website,建议还是选 ...
- jQuery -> end方法的使用方法
我们在对结果集使用find.filter等方法时,会改变结果集. 这样的改变原先结果集的方法被称作destructive jQuery method jQuery cookbook有例如以下定义: A ...