您的位置:首页 > 编程语言 > Lua

使用ngx_lua发送文件给服务器

2015-10-28 10:02 363 查看
网上搜索了好久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协议发送文件成功了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lua http java