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 ...
随机推荐
- Ubuntu下安装Kafka Manager
参考 : kafka管理器kafka-manager部署安装 下载Kafka Manager,并进行打包,由于Kafka manager是由scala写的,所以需要由sbt的支持 git clone ...
- 24小时学通Linux内核之电源开和关时都发生了什么
说实话感觉自己快写不下去了,其一是有些勉强跟不上来,其二是感觉自己越写越差,刚开始可能是新鲜感以及很多读者的鼓励,现在就是想快点完成自己制定的任务,不过总有几个读者给自己鼓励,很欣慰的事情,不多感慨了 ...
- [原]eclipse + pydev :Error in sitecustomize; set PYTHONVERBOSE for tracaeback: KeyError: 'sitecustomize'
问题点: 安装 eclipse + pydev的时候出现 Error in sitecustomize; set PYTHONVERBOSE for tracaeback: KeyError: 'si ...
- 如何使用LinkedHashMap来实现一个LruCache
最近在看mybatis的源代码,发现了mybatis中实现的LruCache使用到了LinkedHashMap,所以就探究了一下LinkedHashMap是如何支持Lru缓存的 LinkedHashM ...
- Mysql命令行tab自动补全方法
在mysql命令行有时为了方便想要按tbl键自动补全命令,以便节约时间. 具体方法如下: 第一步:修改my.cnf vi mysql/etc/my.cnf 将下图红框的代码注释,修改成如下代码: #d ...
- poj 2826
太自闭了...明明很水的说... 有三种为0的情况.一种是有水平,一种是没交点. 第三种有点难想啊.就是下面那个板子被上面的挡住了,,雨水进不去... 关键是我翻了翻discuss找到了这种数据,,但 ...
- Nestjs 获取cookie
Docs yarn add cookie-parser main.ts import { NestFactory } from '@nestjs/core'; import { AppModule } ...
- PHP中递归的实现(附例子)
递归函数是一种调用自己的函数.写递归函数时要小心,因为可能会无穷递归下去.必须确保有充分的方法来终止递归. 一:使用参数引用完成递归函数.操作的是同一块内存地址. <?php $i=1; fun ...
- 4.express 框架
express express 官网:http://expressjs.com/ 中文:http://www.expressjs.com.cn/ 库:jquery 一堆 的属性和方法 框架:expre ...
- 30、git 使用
Git 一. 目标 (一) Git的操作 二. Git和SVN的区别 (一) SVN优缺点 1. 优点: (1) 管理方便,逻辑明确 (2) 易于管理,集中式服务器更能保证安全性 (3) 代码一致性非 ...