让nginx支持文件上传的几种模式
2019独角兽企业重金招聘Python工程师标准>>>
文件上传的几种不同语言和不同方法的总结。
第一种模式 : PHP 语言来处理
这个模式比较简单, 用的人也是最多的, 类似的还有用 .net 来实现, jsp来实现, 都是处理表单。只有语言的差别, 本质没有任何差别。
file.php 文件内容如下 :
<?phpif ($_FILES["file"]["error"] > 0){echo "Return Code: " . $_FILES["file"]["error"] . "<br />";}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 的文件来处理上传上来的文件, 文件内容如下 :
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 filenamefunction get_filename(res)local filename = ngx.re.match(res,'(.+)filename="(.+)"(.*)')if filename then return filename[2]end
endlocal osfilepath = "/usr/local/openresty/nginx/html/"
local i=0
while true dolocal typ, res, err = form:read()if not typ thenngx.say("failed to read: ", err)returnendif typ == "header" thenif res[1] ~= "Content-Type" thenfilename = get_filename(res[2])if filename theni=i+1filepath = osfilepath .. filenamefile = io.open(filepath,"w+")if not file thenngx.say("failed to open file ")returnendelseendendelseif typ == "body" thenif file thenfilelen= filelen + tonumber(string.len(res)) file:write(res)elseendelseif typ == "part_end" thenif file thenfile:close()file = nilngx.say("file upload success")endelseif typ == "eof" thenbreakelseend
end
if i==0 thenngx.say("please upload at least one file!")return
end
我把上面这个 savefile.lua 文件放到了 nginx/conf/lua/ 目录中
nginx.conf 配置文件中添加如下的配置 :
location /uploadfile{content_by_lua_file 'conf/lua/savefile.lua';}
用下面的上传命令进行测试成功
curl -F "action=uploadfile" -F "file=@abc.zip" http://127.0.0.1/uploadfile
第三种模式: perl 语言来处理
编译 nginx 的时候 用 --with-http_perl_module 让其支持perl脚本
然后用perl来处理表单, 这种模式我还没做测试, 如果有那位弟兄试验过, 帮我补充一下。
下面的代码为 PERL 提交表单的代码:
use strict;
use warnings;
use WWW::Curl::Easy;
use WWW::Curl::Form;my $curl = WWW::Curl::Easy->new;
my $form = WWW::Curl::Form->new;$form->formaddfile("11game.exe", 'FILE1', "multipart/form-data");
# $form->formadd("FIELDNAME", "VALUE");$curl->setopt(CURLOPT_HTTPPOST, $form);$curl->setopt(CURLOPT_HEADER,1);$curl->setopt(CURLOPT_URL, 'http://127.0.0.1/uploadfile');# A filehandle, reference to a scalar or reference to a typeglob can be used here.my $response_body;$curl->setopt(CURLOPT_WRITEDATA,\$response_body);# Starts the actual requestmy $retcode = $curl->perform;# Looking at the results...if ($retcode == 0) {print("Transfer went ok\n");my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);# judge result and next action based on $response_codeprint("Received response: \n$response_body\n");}else {# Error code, type of error, error messageprint("An error happened: $retcode ".$curl->strerror($retcode)." ".$curl->errbuf."\n");}
服务器端的代码我不是用perl CGI, 而是嵌入nginx 的 perl脚本, 所以处理表单的代码还没有测试通过,等有时间了在研究一下。
第四种模式:用 http 的dav 模块的 PUT 方法
编译 nginx 的时候 用 --with-http_dav_module 参数让其支持 dav 模式
nginx.conf文件中配置如下 :
location / {client_body_temp_path /usr/local/openresty/nginx/html/tmp;dav_methods PUT DELETE MKCOL COPY MOVE;create_full_put_path on;dav_access group:rw all:r;root html;#index index.html index.htm;}
用下面的命令进行测试可以成功 :
curl --request PUT --data-binary "@11game.exe" --header "Content-Type: application/octet-stream" http://127.0.0.1/game.exe
其中11game.exe为上传的本地文件。
本人打算用perl脚本来PUT二进制文件, 但是尝试失败, 下面的代码可以PUT文本文件,无法PUT二进制文件,有那我知道的给我回复一下,不胜感激。
use strict;
use warnings;use LWP::UserAgent;
use HTTP::Request;# require HTTP::Request;my $r = HTTP::Request->new();$r->method("PUT");$r->uri("http://127.0.0.1/ssss.txt");$r->content("ssssssssssssss");
my $ua = LWP::UserAgent->new;
my $res = $ua->request($r);#二进制文件假如很大, 也不可能赋值给一个变量啊。 官方资料也没有找到PUT二进制文件的方法。郁闷。。。
只有第四种是 PUT 方法, 其他的三种都属于 POST 表单的方法。
转载于:https://my.oschina.net/u/178116/blog/300456
让nginx支持文件上传的几种模式相关推荐
- 如何使用apiPOST进行模拟发送get、post、delete、put请求(支持文件上传)
现在的模拟发送请求插件很多,但亲测apiPOST更好用一些,因为它不仅可以模拟发送get.post.delete.put请求,还可以导出文档,中文界面更适合国内的程序员. 今天来分享如何使用apiPO ...
- 大文件上传 问题解决三种方案
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...
- JavaBean实现多个文件上传的两种方法
JavaBean实现多个文件上传的两种方法 王新芳 刘杰 北京工商大学计算机学院 摘要:本文介绍了JavaBean实现多个文件上传的两种方法,分别是使用http协议和ftp协议实现.首先 ...
- 文件上传的三种方式-Java
前言:负责,因为该项目他(jetty嵌入式开始SpringMvc)实现文件上传的必要性,并拥有java文件上传这一块还没有被曝光.并 Http 更多晦涩协议.因此,这种渐进的方式来学习和实践上载文件的 ...
- 原生态的ajax如何上传文件,原生ajax和iframe框架实现图片文件上传的两种方式
大家应该可以举出几种常用的异步文件上传功能的实现方式,使用频率较多的有原生ajax和iframe框架,实现图片文件上传,下面就为大家分享图片文件上传的两种方式:原生ajax和iframe框架,供大家参 ...
- nginx java文件上传_Nginx实现文件的上传和下载
文件的上传只要保证特殊的地址先到达Nginx,然后通过Nginx指定至指定的服务器即可,目前配置是本机.文件的下载的做法就是把本机的当前目录下面的文件给返回回去. server { listen ; ...
- nginx搭建文件上传下载服务器
最近要搭建文件一个服务器, 准备使用python的web框架tornado来做.发现了这篇blog,准备使用nginx来实现文件上传和下载的功能.下面把实现步骤记录下来,中间有很多坑. 系统环境:ce ...
- 让UpdatePanel支持文件上传(2):服务器端组件
我们现在来关注服务器端的组件.目前的主要问题是,我们如何让页面(事实上是ScriptManager控件)认为它接收到的是一个异步的回送?ScriptManager控件会在HTTP请求的Header中查 ...
- 安卓开发8-WebView支持文件上传
安卓手机中采用webview访问OA系统,当OA中使用input=file的方式时,点选择文件没有反应,需要在WebChromeClient中增加openFileChooser方法:chrome浏览器 ...
最新文章
- c语言相邻字符串字面量,C语言预处理#运算符的细节
- 网站SEO优化中几个不为人知的小细节分享!
- 【BLE MIDI】开发 BLE MIDI 硬件电子乐器设备需要遵循的相关规范 ( 资料收集 )
- 成功解决graphviz\backend.py, line 162, in pipe raise ExecutableNotFound(args) graphviz.backend.Executab
- 图的存储结构matlab,matlab存储 一幅图像的的函数为( )
- UI标签库专题二:JEECG智能开发平台Column(列) 子标签
- 那些年我们追过的计算机经典书
- Win10 开启移动热点 WiFi 的简单方法
- 【渝粤教育】国家开放大学2018年春季 7392-21DMatlab语言及其应用 参考试题
- MVC 如何设定默认默认路由为指定的Area下的某个action(笔记)
- 圆周率π的近似计算(三)-MapReduce分布式计算入门
- 【微信支付】springboot 微信app支付包括回调通知
- 经纬度校验、整数和小数校验
- python夜曲编程_夜曲编程——我毕业了!!!
- 如何通过F12开发者工具保存网页中想要的视频资源
- 时钟(CLOCK)置换算法
- 一年的第多少周+一个月的第多少天+一周的第多少天
- 我的世界java版红石电梯_《我的世界》红石电梯建造教程
- 北京地铁线路图(最新-非常实用)
- vreyCD 标题中的经典名句