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支持文件上传的几种模式相关推荐

  1. 如何使用apiPOST进行模拟发送get、post、delete、put请求(支持文件上传)

    现在的模拟发送请求插件很多,但亲测apiPOST更好用一些,因为它不仅可以模拟发送get.post.delete.put请求,还可以导出文档,中文界面更适合国内的程序员. 今天来分享如何使用apiPO ...

  2. 大文件上传 问题解决三种方案

    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  3. JavaBean实现多个文件上传的两种方法

    JavaBean实现多个文件上传的两种方法 王新芳        刘杰 北京工商大学计算机学院 摘要:本文介绍了JavaBean实现多个文件上传的两种方法,分别是使用http协议和ftp协议实现.首先 ...

  4. 文件上传的三种方式-Java

    前言:负责,因为该项目他(jetty嵌入式开始SpringMvc)实现文件上传的必要性,并拥有java文件上传这一块还没有被曝光.并 Http 更多晦涩协议.因此,这种渐进的方式来学习和实践上载文件的 ...

  5. 原生态的ajax如何上传文件,原生ajax和iframe框架实现图片文件上传的两种方式

    大家应该可以举出几种常用的异步文件上传功能的实现方式,使用频率较多的有原生ajax和iframe框架,实现图片文件上传,下面就为大家分享图片文件上传的两种方式:原生ajax和iframe框架,供大家参 ...

  6. nginx java文件上传_Nginx实现文件的上传和下载

    文件的上传只要保证特殊的地址先到达Nginx,然后通过Nginx指定至指定的服务器即可,目前配置是本机.文件的下载的做法就是把本机的当前目录下面的文件给返回回去. server { listen ; ...

  7. nginx搭建文件上传下载服务器

    最近要搭建文件一个服务器, 准备使用python的web框架tornado来做.发现了这篇blog,准备使用nginx来实现文件上传和下载的功能.下面把实现步骤记录下来,中间有很多坑. 系统环境:ce ...

  8. 让UpdatePanel支持文件上传(2):服务器端组件

    我们现在来关注服务器端的组件.目前的主要问题是,我们如何让页面(事实上是ScriptManager控件)认为它接收到的是一个异步的回送?ScriptManager控件会在HTTP请求的Header中查 ...

  9. 安卓开发8-WebView支持文件上传

    安卓手机中采用webview访问OA系统,当OA中使用input=file的方式时,点选择文件没有反应,需要在WebChromeClient中增加openFileChooser方法:chrome浏览器 ...

最新文章

  1. c语言相邻字符串字面量,C语言预处理#运算符的细节
  2. 网站SEO优化中几个不为人知的小细节分享!
  3. 【BLE MIDI】开发 BLE MIDI 硬件电子乐器设备需要遵循的相关规范 ( 资料收集 )
  4. 成功解决graphviz\backend.py, line 162, in pipe raise ExecutableNotFound(args) graphviz.backend.Executab
  5. 图的存储结构matlab,matlab存储 一幅图像的的函数为( )
  6. UI标签库专题二:JEECG智能开发平台Column(列) 子标签
  7. 那些年我们追过的计算机经典书
  8. Win10 开启移动热点 WiFi 的简单方法
  9. 【渝粤教育】国家开放大学2018年春季 7392-21DMatlab语言及其应用 参考试题
  10. MVC 如何设定默认默认路由为指定的Area下的某个action(笔记)
  11. 圆周率π的近似计算(三)-MapReduce分布式计算入门
  12. 【微信支付】springboot 微信app支付包括回调通知
  13. 经纬度校验、整数和小数校验
  14. python夜曲编程_夜曲编程——我毕业了!!!
  15. 如何通过F12开发者工具保存网页中想要的视频资源
  16. 时钟(CLOCK)置换算法
  17. 一年的第多少周+一个月的第多少天+一周的第多少天
  18. 我的世界java版红石电梯_《我的世界》红石电梯建造教程
  19. 北京地铁线路图(最新-非常实用)
  20. vreyCD 标题中的经典名句

热门文章

  1. 分享一个非常全的php正则验证车牌格式的函数
  2. 几款开源图像处理软件评测研究
  3. Hyperreal number
  4. 重拾PHP--开篇碎碎念
  5. 视频:如何把应用通过vmc部署到cloud foundry上
  6. 图示Windows Server2008 Feature Components
  7. SpringCloud OpenFeign服务调用客户端介绍及配置使用
  8. SpringCloud Eureka自我保护机制介绍及配置
  9. jvm面试 -- 谈谈ClassLoader ,ClassLoader的双亲委派机制 , loadClass和forName的区别
  10. centOS目录结构