使用ngx_lua发送文件给服务器
2015-10-28 10:02
363 查看
网上搜索了好久lua发送文件的资料,发现openresty的库里面没有post 文件的函数,没办法,只能自己实现
首先,需要了解http发送文件的原理,具体请转到http://blog.csdn.net/terry7/article/details/49464335
下面是实现的代码
步骤一:新建comm.lua,里面写httpPostFile函数
步骤二:用java简单的搭建一个文件接收服务器,新建一个test的web项目,
写一个servlet,UpLoadServlet.java
步骤三:修改WebRoot/WEB-INF/web.xml
代码完成,下面写一个lua测试脚本,看看效果
test_comm.lua
执行测试脚本,
tomcat日志打印上传成功
看看文件夹中是否有该文件
OK,文件上传成功。
使用lua构建http协议发送文件成功了
首先,需要了解http发送文件的原理,具体请转到http://blog.csdn.net/terry7/article/details/49464335
下面是实现的代码
步骤一:新建comm.lua,里面写httpPostFile函数
local http = require("resty.http") local TIMEOUT = 30 --默认超时时间 --生成随机函数,需要放大后处理 function random(n,m) math.randomseed(os.clock()*math.random(100000,9000000)*math.random(100000,900000)) return math.random(n,m) end --生成指定长度的随机字符串 function random_str(len) local str = "" for i=1,len,1 do str = str .. string.char(random(97,122)) end return str end function httpPostFile(url, filepath, timeout) local httpc = http.new() --如果不传入timeout,则使用默认时间 local timeout = timeout or TIMEOUT http:set_timeout(timeout*1000) --生成随机字符串,用于区分各个文件的内容间隔 local boundary = random_str(12) local str = "" --读取文件内容 local f = io.open(filepath, 'r') local data = f:read("*all") f:close() --组建body str = str .. "------------------------------" .. boundary .. "\r\n" str = str .. 'Content-Disposition: form-data; name="' .. filemsg .. '"; filename="' .. file .. '"\r\n' str = str .. "Content-Type: text/plain\r\n\r\n" str = str .. data .. "\r\n" str = str .. "------------------------------" .. boundary .. "--\r\n" local res, err_ = httpc:request_uri(url, { method = "POST", body = str, ssl_verify = ssl_verify or false, --设置headers headers = { ["Accept"] = "*/*", ["Content-Type"] = "multipart/form-data; boundary=----------------------------" .. boundary, } }) if not res then return res, err_ else if res.status == 200 then return res.body, err_ else return nil, err_ end end end
步骤二:用java简单的搭建一个文件接收服务器,新建一个test的web项目,
写一个servlet,UpLoadServlet.java
package cn.terry.servlet; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * * @author administrator */ @SuppressWarnings("unchecked") public class UpLoadServlet extends HttpServlet { private static final long serialVersionUID = 1L; private String uploadPath = "D:\\temp"; // 上传文件的目录 File tempPathFile; // 重写doPost方法,处理事件识别请求 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // Set factory constraints factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb factory.setRepository(tempPathFile);// 设置缓冲区目录 // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Set overall request size constraint upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB List<FileItem> items = upload.parseRequest(request);// 得到所有的文件 Iterator<FileItem> i = items.iterator(); while (i.hasNext()) { FileItem fi = (FileItem) i.next(); String fileName = fi.getName(); if (fileName != null) { File fullFile = new File(new String(fi.getName().getBytes(), "utf-8")); // 解决文件名乱码问题 File savedFile = new File(uploadPath, fullFile.getName()); fi.write(savedFile); } } System.out.print("upload succeed"); } catch (Exception e) { } } }
步骤三:修改WebRoot/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>cn.terry.service.UpLoadServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/UploadServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
代码完成,下面写一个lua测试脚本,看看效果
test_comm.lua
local timeout = 30 local httpurl = "http://127.0.0.1:8080/test/UploadServlet" function MAIN() ngx.say("【begin test_httpPostFile 】") local filepath = "/home/nginx_pbcs/openresty/nginx/test/multipart-post.lua" local body = httpPostFile(httpurl,filepath,timeout) ngx.say("【stop test_httpPostFile 】") end MAIN()
执行测试脚本,
tomcat日志打印上传成功
看看文件夹中是否有该文件
OK,文件上传成功。
使用lua构建http协议发送文件成功了
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- RPC failed; result=22, HTTP code = 411
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树