使用ngx_lua发送文件给服务器

来源:互联网 发布:手机淘宝代购怎么做 编辑:程序博客网 时间:2024/05/17 22:28

网上搜索了好久lua发送文件的资料,发现openresty的库里面没有post 文件的函数,没办法,只能自己实现


首先,需要了解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 strendfunction 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    endend


步骤二:用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  = 30local 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 】")endMAIN()


执行测试脚本,

tomcat日志打印上传成功

看看文件夹中是否有该文件


OK,文件上传成功。


使用lua构建http协议发送文件成功了


0 0
原创粉丝点击