nginx上傳模塊php
一. nginx upload module原理html
官方文檔: http://www.grid.net.ru/nginx/upload.en.htmlnginx
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指令處理。web
具體的過程以下:正則表達式
1. 用戶訪問可以選擇上傳文件的頁面後端
2. 用戶提交表單瀏覽器
3. 瀏覽器把文件和有關文件的信息做爲請求的一部分發送給服務器服務器
4. 服務器把文件保存到臨時存儲目錄下upload_storeapp
5. upload_pass指定的處理表單提交的php頁面將文件從upload_store拷貝到持久存儲位置post
二.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 硬限制