使用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
- 使用ngx_lua发送文件给服务器
- Java客户端给服务器发送文件
- 使用wininet向FTP服务器发送文件
- Ngx_Lua使用分享
- Ngx_Lua使用分享
- 为什么要使用ngx_lua
- Ngx_Lua使用分享
- 发送xml数据给服务器
- 给服务器发送JSON数据
- 发送json字符串给服务器
- 发送JSON数据给服务器
- 给服务器发送JSON数据
- 发送json数据给服务器
- Ngx_lua
- Java给服务端发送文件
- iOS中使用POST向服务器发送图片文件
- Java学习日记8:文件上传工具类的实现和服务器给客户端发送图片
- Android捕获全局异常并以文件或者异常内容发送给指定服务器
- git内部实现:分支
- Linux的cut命令
- 素数环
- QT与注册表
- 怎样让自我评价变成简历最出彩的地方?
- 使用ngx_lua发送文件给服务器
- A4大小,打印时不打控件
- cordova 创建空白项目,并安装gulp
- Android客户端每周自动化回归报告
- Redmine项目管理
- 获得由ControlTemplate或DataTemplate生成的控件的内部控件
- 找找2
- PostgreSQL 函数稳定性状态
- oracle与mysql在语法上的区别