openresty lua 文件上传与删除
【1】openresty 上传upload源码库
Github:https://github.com/openresty/lua-resty-upload
源码文件upload.lua文件
【2】上传
代码如下,详见注释:
local upload = require "resty.upload" local cjson = require "cjson" -- test.sh -- curl -F "filename=@/home/test/test.wav" "http://127.0.0.1/uploadfile.gss?filename=test.wav&&type=wav&&billingcode=87654321" , ["msg"] = "upload success!"} local args = ngx.req.get_uri_args() if not args then ngx.exit(ngx.HTTP_BAD_REQUEST) end local filename = args["filename"] or "noname.file" local billingcode = args["billingcode"] local filetype = args["type"] -- 判断文件类型 local res, err = ngx.re.match(filename, [[\.(?:xml|wav|ext)$]]) if not res then response.code = response.msg = "only xml or wav or ext format file can upload" ngx.say(cjson.encode(response)) return end if err then ngx.log(ngx.ERR, "match err:", err) ngx.exit(ngx.HTTP_BAD_REQUEST) end -- 保存文件根目录 local save_file_root = "/home/kaizenly/" local save_file_dir = save_file_root -- 创建各类文件的保存目录[wav/ext/app] if "wav" == filetype or "ext" == filetype then save_file_dir = save_file_dir .. filetype elseif "flow" == filetype or "state" == filetype then save_file_dir = save_file_dir .. "app" else response.code = response.msg = "error file type! filetype: " .. filetype ngx.say(cjson.encode(response)) return end local dfile = io.open(save_file_dir, "rb") if dfile then dfile:close() else local md = "mkdir " local mdpath = md .. save_file_dir os.execute(mdpath) ngx.log(ngx.ERR, "create save file first dir: " .. mdpath) end save_file_dir = save_file_dir .. "/" -- 创建各类文件的保存子目录[按billingcode存储] local save_file_path = '' if "wav" == filetype or "ext" == filetype then save_file_path = save_file_dir .. billingcode else save_file_path = save_file_dir .. filetype .. "xml" end local dfile = io.open(save_file_path, "rb") if dfile then dfile:close() else local md = "mkdir " local mdpath = md .. save_file_path os.execute(mdpath) ngx.log(ngx.ERR, "create save file second dir: " .. mdpath) end save_file_path = save_file_path .. "/" -- 创建上传form -- should be set to 4096 or 8192 local form, err = upload:new(chunk_size) if not form then ngx.log(ngx.ERR, "failed to new upload: ", err) ngx.exit() end form:set_timeout() -- 1 sec local function close_file(write_file) if io.type(write_file) == "file" then -- write_file处于打开状态,则关闭文件。 write_file:close() write_file = nil end end -- 上传过程 local write_file -- 文件句柄 while true do local typ, recv, err = form:read() if not typ then response.code = -- ngx.say("failed to read file: ", err) response.msg = "failed to read file" break end if typ == "header" and "file" ~= io.type(write_file) then write_file, err = io.open(save_file_path .. filename, 'wb+') if err then ngx.log(ngx.ERR, "failed create hd:", err) response.code = response.msg = "failed create file:" .. err break end elseif typ == "body" and "file" == io.type(write_file) then write_file:write(recv) elseif typ == "part_end" then close_file(write_file) elseif typ == "eof" then response.code = response.msg = "upload success" break end end ngx.say(cjson.encode(response))
如上代码。
【3】删除
代码如下,详见注释:
local upload = require "resty.upload" local cjson = require "cjson" local args = ngx.req.get_uri_args() if not args then ngx.exit(ngx.HTTP_BAD_REQUEST) end local filename = args["filename"] or "noname.file" local billingcode = args["billingcode"] or "" local filetype = args["type"] , ["msg"] = "remove success!"} -- 判断文件类型 local res, err = ngx.re.match(filename, [[\.(?:xml|wav|ext)$]]) if not res then response.code = response.msg = "only xml or wav or ext format file can remove" ngx.say(cjson.encode(response)) return end if err then ngx.log(ngx.ERR, "match err:", err) ngx.exit(ngx.HTTP_BAD_REQUEST) end -- 保存文件根目录 local save_file_root = "/home/kaizenly/" -- 确定删除文件路径 local remove_file_path = '' if "wav" == filetype or "ext" == filetype then remove_file_path = save_file_root .. filetype if "" ~= billingcode then remove_file_path = remove_file_path .. "/" .. billingcode end elseif "flow" == filetype or "state" == filetype then remove_file_path = save_file_root .. "app/" .. filetype .. "xml" else response.code = response.msg = "failed to remove, error file type!" ngx.say(cjson.encode(response)) return end remove_file = remove_file_path .. "/" .. filename -- 判断删除文件是否存在 local dfile = io.open(remove_file, "rb") if dfile then dfile:close() else response.code = response.msg = "the remove file is not exist!" ngx.say(cjson.encode(response)) return end -- 执行删除 local res, err = os.remove(remove_file) if not res then response.code = response.msg = "failed to remove " .. remove_file .. ", err: " .. (err or '') else ngx.log(ngx.ERR, "success to remove file: " .. remove_file) -- 如果目录为空,删除目录 local cmd = "ls " .. remove_file_path local s = io.popen(cmd) local file_lists = s:read("*all") then ngx.log(ngx.ERR, "success to remove file second dir: " .. remove_file_path) os.remove(remove_file_path) end end ngx.say(cjson.encode(response))
如上代码
Good Good Study, Day Day Up.
顺序 选择 循环 总结
openresty lua 文件上传与删除的更多相关文章
- Struts2 文件上传,下载,删除
本文介绍了: 1.基于表单的文件上传 2.Struts 2 的文件下载 3.Struts2.文件上传 4.使用FileInputStream FileOutputStream文件流来上传 5.使用Fi ...
- SpringMVC ajax技术无刷新文件上传下载删除示例
参考 Spring MVC中上传文件实例 SpringMVC结合ajaxfileupload.js实现ajax无刷新文件上传 Spring MVC 文件上传下载 (FileOperateUtil.ja ...
- 又拍云 Node.js 实现文件上传、删除
Node.js 服务端 使用 Node.js + Express.js 实现 服务端 const express = require("express"); const app = ...
- java操作FTP,实现文件上传下载删除操作
上传文件到FTP服务器: /** * Description: 向FTP服务器上传文件 * @param url FTP服务器hostname * @param port FTP服务器端口,如果默认端 ...
- HDFS操作--文件上传/创建/删除/查询文件信息
1.上传本地文件到HDFS //上传本地文件到HDFS public class CopyFile { public static void main(String[] args) { try { C ...
- js实现文件上传,删除效果
效果图: 刚开始: 点击按钮"选择更多后",可以添加很多选择文件: 点击按钮"删除"后: 实现代码: <!DOCTYPE html><html ...
- [java]文件上传下载删除与图片预览
图片预览 @GetMapping("/image") @ResponseBody public Result image(@RequestParam("imageName ...
- 【C#公共帮助类】FTPClientHelper帮助类,实现文件上传,目录操作,下载等动作
关于本文档的说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利. 本人自从几年前走上编程之路,一直致力于收集 ...
- C# 文件上传下载功能实现 文件管理引擎开发
Prepare 本文将使用一个NuGet公开的组件技术来实现一个服务器端的文件管理引擎,提供了一些简单的API,来方便的实现文件引擎来对您自己的软件系统的文件进行管理. 在Visual Studio ...
随机推荐
- Linux 文件特殊权限_013
***Linux 系统文件除了9位基本权限,还有额外3位特殊权限,分别是SUID(setuid),SGID(setgid),SBIT(sticky bit) 一.Linux 系统文件3位特殊权限位说明 ...
- saltstack在jianja模板中,执行salt函数来获取某些变量的值,并且将配置写入到配置文件中?
问题描述: 通过saltstack的jinja模板方式,可以将变量的值写入到配置文件,即动态获取的方式.这里介绍,通过执行salt函数来获取值的方式. 演示: 1.通过在sls中,增加jinja的模板 ...
- 【物联网】 9个顶级开发IoT项目的开源物联网平台(转)
物联网(IoT)是帮助人工智能(AI)以更好的方式控制和理解事物的未来技术. 我们收集了一些最有名的物联网平台,帮助您以受控方式开发物联网项目. 物联网平台是帮助设置和管理互联网连接设备的组件套件. ...
- PHP实现URL长连接转短连接方法总结
短链接,通俗来说,就是将长的URL 网址,通过程序计算等方式,转换为简短的网址字符串. 这样的话其好处为:1.内容需要:2.用户友好:3.便于管理. 实现短网址(short URL)系统比较流行的算法 ...
- 在eclipse中使用Tomcat时出现Could not publish server ...错误
在使用eclipse加载tomcat服务器运行项目时遇到问题: 在Tomcat的安装目录下的\conf\server.xml中将<Context>标签所对应的重复名称项目删除 这 ...
- windows 安装mongodb
1.mongodb官网下载:http://www.mongodb.org/downloads 2.将下载的mongodb压缩包解压到对应文件夹,我的是:D:\pc\mongodb,请注意,我的bin目 ...
- linux的基本操作(shell 脚本的基础知识)
shell 脚本的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员.目前很多单位在招聘linux系统管理员时,shell脚本 ...
- js设计模式(六)---组合模式
组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构.除了用来表示树形结构之外,组合模式的另一个好处是通过对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性.基本图例 1.组合模式 ...
- gui小计算器的程序写法
import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.sw ...
- 求最短路的三种方法:dijkstra,spfa,floyd
dijkstra是一种单源最短路算法.在没有负权值的图上,vi..vj..vk是vi到vk最短路的话,一定要走vi到vj的最短路.所以每次取出到起点距离最小的点,从该点出发更新邻接的点的距离,如果更新 ...