2013-07-30 16:05 7881人閱讀 評論(2) 收藏 舉報php
文件上傳的幾種不一樣語言和不一樣方法的總結。html
第一種模式 : PHP 語言來處理nginx
這個模式比較簡單, 用的人也是最多的, 相似的還有用 .net 來實現, jsp來實現, 都是處理表單。只有語言的差異, 本質沒有任何差異。
git
file.php 文件內容以下 :
github
[php] view plaincopy服務器
<?php curl
if ($_FILES["file"]["error"] > 0) jsp
{ 測試
echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; ui
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
?>
測試命令 :
curl -F "action=file.php" -F "file=@xxx.c" http://192.168.1.162/file.php
這樣就能夠把本地文件 xxx.c 經過表單的形式提交到服務器, file.php文件就會處理該表單。
第二種模式: lua 語言來處理
這種模式須要用 ngx_lua 模塊的支持, 你能夠直接下載 ngx_openresty 的源碼安裝包, 該項目由春哥負責。
春哥爲了處理 文件上傳, 還專門寫了個lua的 upload.lua 模塊。
網址爲 https://github.com/agentzh/lua-resty-upload 你們能夠下載, 裏面只用到 upload.lua 文件便可, 把這個文件放到
/usr/local/openresty/lualib/resty/ 這個目錄便可(該目錄是缺省安裝的目錄, ./configure --prefix=/usr 能夠改變目錄)
下來寫一個 savefile.lua 的文件來處理上傳上來的文件, 文件內容以下 :
[plain] view plaincopy
package.path = '/usr/local/share/lua/5.1/?.lua;/usr/local/openresty/lualib/resty/?.lua;'
package.cpath = '/usr/local/lib/lua/5.1/?.so;'
local upload = require "upload"
local chunk_size = 4096
local form = upload:new(chunk_size)
local file
local filelen=0
form:set_timeout(0) -- 1 sec
local filename
function get_filename(res)
local filename = ngx.re.match(res,'(.+)filename="(.+)"(.*)')
if filename then
return filename[2]
end
end
local osfilepath = "/usr/local/openresty/nginx/html/"
local i=0
while true do
local typ, res, err = form:read()
if not typ then
ngx.say("failed to read: ", err)
return
end
if typ == "header" then
if res[1] ~= "Content-Type" then
filename = get_filename(res[2])
if filename then
i=i+1
filepath = osfilepath .. filename
file = io.open(filepath,"w+")
if not file then
ngx.say("failed to open file ")
return
end
else
end
end
elseif typ == "body" then
if file then
filelen= filelen + tonumber(string.len(res))
file:write(res)
else
end
elseif typ == "part_end" then
if file then
file:close()
file = nil
ngx.say("file upload success")
end
elseif typ == "eof" then
break
else
end
end
if i==0 then
ngx.say("please upload at least one file!")
return
end
我把上面這個 savefile.lua 文件放到了 nginx/conf/lua/ 目錄中
nginx.conf 配置文件中添加以下的配置 :
[html] view plaincopy
location /uploadfile
{
content_by_lua_file 'conf/lua/savefile.lua';
}
用下面的上傳命令進行測試成功
curl -F "action=uploadfile" -F "file=@abc.zip" http://127.0.0.1/uploadfile