使用ngx_lua发送文件给服务器

3 篇文章 0 订阅
2 篇文章 0 订阅

网上搜索了好久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 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协议发送文件成功了


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值