local os = require 'os'
local upload = require 'resty.upload'
get_os_type
local function get_os_type()
local os_type = 'unknown'
if package.config:sub(1,1) == '\\' then
os_type = 'windows'
elseif package.config:sub(1,1) == '/' then
os_type = 'unix'
end
return os_type
end
is_windows
local function is_windows()
if get_os_type() == 'windows' then
return true
end
return false
end
get_file_name
local function get_file_name(response)
local _file_name = ngx.re.match(response, '(.+)filename="(.+)"(.*)')
if _file_name then
return _file_name[2]
end
end
get_timestamp
local function get_timestamp_ss()
local _timestamp = string.format('%d', os.time())
return _timestamp
end
local function get_timestamp_sss()
local _timestamp = string.format('%.3f', ngx.now())
return _timestamp
end
local function get_timestamp_linux()
local _pipe = io.popen('linux_date "+%s%3N"')
local _timestamp = _pipe:read("*a")
_pipe:close()
_timestamp = _timestamp:gsub('\r\n$', '')
_timestamp = _timestamp:gsub('\n$', '')
return _timestamp
end
local function get_timestamp()
return get_timestamp_sss()
end
get_file_path
local function assert_path_file(filePath)
local _file_path = filePath
if (is_windows()) then
_file_path = string.gsub(_file_path, '/', '\\')
end
_status = os.execute('if not exist ' .. _file_path .. ' mkdir ' .. _file_path)
end
local function get_file_ext(fileName)
local _file_ext = string.match(fileName, '(%.[^.]+)$')
return _file_ext
end
local function write_txt_file(filePath, context)
local _txt_file = nil
_txt_file = io.open(filePath, 'w+')
if _txt_file then
_txt_file:write(context)
_txt_file:close()
end
_txt_file = nil
end
local function get_file_path(uploadFile)
local _status = false
local _file_path = ngx.var.client_upload_dir
local timestamp = os.time()
assert_path_file(_file_path)
local dateTable = os.date('*t', timestamp)
_file_path = string.format('%s/%s', _file_path, string.format('%04d', dateTable.year))
assert_path_file(_file_path)
_file_path = string.format('%s/%s', _file_path, string.format('%02d', dateTable.month))
assert_path_file(_file_path)
_file_path = string.format('%s/%s', _file_path, string.format('%02d', dateTable.day))
assert_path_file(_file_path)
_file_path = string.format('%s/%s', _file_path, string.format('%02d', dateTable.hour))
assert_path_file(_file_path)
_file_path = string.format('%s/%s', _file_path, uploadFile)
if (is_windows()) then
_file_path = string.gsub(_file_path, '/', '\\')
end
return _file_path
end
main
local i = 0
while true do
local form_type, form_response, form_error = form:read()
if not form_type then
message = string.format('{"code":1,"msg":"%s%s"}', 'failed to read: ', form_error)
ngx.say(message)
return
end
if form_type == 'header' then
if form_response[1] ~= 'Content-Type' then
upload_file = get_file_name(form_response[2])
file_name = upload_file
if file_name then
file_name = string.format('%s.%d%s', get_timestamp(), i, get_file_ext(upload_file))
file_path = get_file_path(file_name)
upload_table[i] = file_name
i = i + 1
file = io.open(file_path, 'wb+')
if not file then
message = string.format('{"code":1,"msg":"%s"}', 'Failed to open file')
ngx.say(message)
return
end
else
end
end
elseif form_type == 'body' then
if file then
file_length = file_length + tonumber(string.len(form_response))
file:write(form_response)
else
end
elseif form_type == 'part_end' then
if file then
file:close()
file = nil
local _upload_dir_length = string.len(ngx.var.client_upload_dir) + 1
_file_path = '/upload' .. string.sub(file_path, _upload_dir_length)
if (is_windows()) then
_file_path = string.gsub(_file_path, '\\', '/')
end
write_txt_file(file_path .. '.txt', upload_file)
upload_line = upload_line .. string.format('{"source":"%s","path":"%s"}', upload_file, _file_path) .. ','
end
elseif form_type == 'eof' then
upload_line = '[' .. upload_line .. ']'
upload_line = string.gsub(upload_line, ',]', ']')
message = string.format('{"code":0,"msg":"%s","data":%s}', 'success', upload_line)
ngx.say(message)
break
else
end
end
if (i == 0) then
message = string.format('{"code":1,"msg":"%s"}', 'Please upload at least one file!')
ngx.say(message)
return
end
conf
location /api/sys/now {
content_by_lua_block {
ngx.header.content_type = 'text/html; charset=utf-8'
local result = string.format('{"code":0,"msg":"success","data":{"timestamp":"%s","now":"%s"}}', string.format('%.3f', ngx.now()), os.date("%Y-%m-%d %H:%M:%S"))
ngx.say(result)
}
}
D:\msys64\home\unix2linux\lua2>curl "http://localhost:9999/api/sys/now" -s | jq
{
"code": 0,
"msg": "success",
"data": {
"timestamp": "1732241439.300",
"now": "2024-11-22 10:10:39"
}
}
demo
D:\msys64\home\unix2linux\lua2>curl -X POST -F"[email protected]" "http://localhost:9999/api/file/upload" -s | jq
{
"code": 0,
"msg": "success",
"data": [
{
"source": "lua.png",
"path": "/upload/2024/11/25/15/1732519677.943.0.png"
}
]
}
/api/dir/list