介绍
前序
该功能是利用openresty的lua脚本实现的图片(文件)保存功能,文件上传使用java代码开发的
数据定义
上传数据和文件信息不分前后,但系统只会保存最后一对信息
- 数据格式:
{"fileDir":"文件保存的目录","fileName":"文件名"}
- 返回结果
{
"status":"是否成功","result":"返回结果","msg":"异常原因"}
enum status:["success","failed"]
- 保存文件夹
所保存到那个文件夹下,在nginx的perfix变量中定义
代码实现
Nginx配置
如下:
server {
listen 80;
server_name localhost;
# 配置保存的文件夹
set $prefix "/data";
location /uploadimage {
# 配置是否每次lua更改都生效,适合调试时使用
# lua_code_cache off;
# 配置lua脚本
content_by_lua_file /openresty-web/luascript/luascript;
}
# 用来配合理解传入到nginx的报文结构
location /uploadtest{
# lua_code_cache off;
content_by_lua_file /openresty-web/luascript/luauploadtest;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
lua脚本
luascript:
package.path = '/openresty-web/lualib/resty/?.lua;'
local upload = require "upload"
local cjson = require("cjson")
Result={status="success",result="",msg=""}
Result.__index=Result
function Result.conSuccess(ret)
ret["status"]="success"
ret["result"]="upload success"
return ret
end
function Result.conFailed(ret,err)
ret["status"]="failed"
ret["msg"]=err
ret["result"]="upload failed"
return ret
end
function Result:new()
local ret={}
setmetatable({},Result)
return ret
end
-- lua-resty-upload
local chunk_size = 4096
local form = upload:new(chunk_size)
if not form then
ngx.say(cjson.encode(Result.conFailed(Result:new(),"plase upload right info")))
return
end
local file
local filelen=0
form:set_timeout(0) -- 1 sec
local filename
local prefix=ngx.var.prefix
-- 匹配文件名,当前案例用于判断是否是文件模块
function get_filename(res)
local filename = ngx.re.match(res,'(.+)filename="(.+)"(.*)')
if filename then
return filename[2]
end
end
-- 用来开启输入流,当文件夹不存在时自动创建
function openstream(fileinfo,opt)
local file,err=io.open(prefix..fileinfo["fileDir"],"r")
if not file then
local start=string.find(err,"No such file or directory")
if start then
local exeret=os.execute("mkdir -p "..prefix..fileinfo["fileDir"])
if exeret ~= 0 then
return nil,"Make directory failed"
end
else