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字段值被一系列的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 硬限制

时间: 2024-11-02 12:53:05

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 : ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module   --add-module=/data/software/lnmp1.

解决nginx上传模块nginx_upload_module传递GET参数

解决nginx上传模块nginx_upload_module传递GET参数的方法总结   最近用户反映我们的系统只能上传50M大小的文件, 希望能够支持上传更大的文件. 很显然PHP无法轻易实现大文件上传, 因为会有各种各样的郁闷问题, 比如服务器超时等, 那么如何解决呢? 我想到了nginx_upload_module!!! 如何安装nginx_upload_module? 请看这里:nginx_upload_module安装使用教程 解决了大文件上传之后又遇到了新问题, 我们希望通过ngin

nginx上传模块nginx_upload_module安装与使用教程

一.nginx_upload_module使用背景 利用nginx上传模块Nginx_upload_module可更有效实现大文件断点续传,还可安装nginx-upload-progress-module扩展显示文件上传进度. 二.nginx_upload_module工作原理 Nginx_upload_module通过nginx服务来接受用户上传的文件,自动解析请求体中存储的所有文件上传到upload_store指定的目录下.这些文件信息从原始请求体中分离并根据nginx.conf中的配置重新

Nginx的Upload上传模块

前段时间做一个项目,需要上传文件,差不多需要20M左右,普通用php处理会比较麻烦,经常超时,而且大量占用资源.于是搜索了下,决定用nginx的upload上传模块来处理. 你可以在这里:http://www.grid.net.ru/nginx/upload.en.html 获取源码.下载以后需要重新编译nginx 1 2 3 ./configure –add-module=/usr/local/nginx_upload_module-* make make install 重启nginx即可以

nginx上传目录配置,禁止执行权限

如果不让有执行权限最简单的办法  代码如下 复制代码 location ~ ^/upload/.*.(php|php5)$ { deny all; } 上面的方法满足不了我要求,后来找到一个不错的脚本  代码如下 复制代码 server         {                 listen       80;                 server_name xxxx.com;                 index index.html index.htm index.p

服务器-nginx上传后的文件怎么合并?

问题描述 nginx上传后的文件怎么合并? 按照网上的做法,在下载了1.3.8以后的版本继承upload_module的时候安装了一个补丁文件,导致上传都是分片上传的,怎么合并? 解决方案 用现在最新稳定版本1.6.2试试呢

《JavaScript设计模式》——第11章 牛郎织女——代理模式 11.1无法获取图片上传模块数据

第11章 牛郎织女--代理模式 代理模式(Proxy):由于一个对象不能直接引用另一个对象,所以需要通过代理对象在这两个对象之间起到中介的作用. 由于用户相册模块上传的照片量越来越大,导致服务器端需要将图片上传模块重新部署到另外一个域(可理解为另一台服务器)中,这样对于前端来说,用户上传图片的请求路径发生变化,指向其他服务器,这就导致跨域问题. 11.1 无法获取图片上传模块数据 "小铭,你帮我看看,为什么我向咱们图片上传模块所在的服务器发送的请求,得不到数据呢?"小白问小铭. //

java编程小说上传-java语言编程小说的上传模块不会做了,请指点

问题描述 java语言编程小说的上传模块不会做了,请指点 用java语言在编程小说的上传功能出现了问题,还请问下一步咋搞? 解决方案 报错的是什么部分错误代码帖出来,上传可以找些io方面的看看 解决方案二: 错误的地方会有信息,可以看看 解决方案三: novel没定义,还是外面定义好了,没传参进来?

ASP.NET 图片上传工具类 upload image简单好用功能齐全

原文:ASP.NET 图片上传工具类 upload image简单好用功能齐全 使用方法: UploadImage ui = new UploadImage(); /***可选参数***/ ui.SetWordWater = "哈哈";//文字水印 // ui.SetPicWater = Server.MapPath("2.png");//图片水印(图片和文字都赋值图片有效) ui.SetPositionWater = 4;//水印图片的位置 0居中.1左上角.2右