diff --git a/prod/combine.lua b/prod/combine.lua new file mode 100644 index 0000000..d295fd7 --- /dev/null +++ b/prod/combine.lua @@ -0,0 +1,42 @@ +local uuid = require "resty.jit-uuid" +local cjson = require "cjson" +uuid.seed() + +local file_dir = ngx.var.tmp_file_dir +ngx.req.read_body() +local req_body = cjson.decode(ngx.req.get_body_data()) +ngx.log(ngx.INFO, 'REQ_BODY -> ', ngx.req.get_body_data()) +local data = req_body["data"]["images"] +local combined = file_dir .. "/" .. uuid.generate_v4() .. ".jpeg"; +local len = table.getn(data) +local origin = {} +for i = 1, len do + ngx.log(ngx.INFO, "COMBINE FILE ->", data[i]) + origin[i] = file_dir .. "/" .. data[i] .. " " +end +-- 从 nginx 变量取 +local magick = ngx.var.magick +local convert = ngx.var.convert + +if not magick then + if not convert then + ngx.status = 500 + ngx.say("image magick not found.") + return + end + magick = "" +end + +local cmd = magick .. " convert -append " .. table.concat(origin, " ") .. " " .. combined +ngx.log(ngx.INFO, 'CMD -> ', cmd) +local result, _, code = os.execute(cmd) +if result and code == 0 then + local file = io.open(combined) + local content = file:read("*all") + file:close() + os.remove(combined) + ngx.say(content) +else + ngx.status = 500 + ngx.say("image combine failed.") +end diff --git a/prod/upload.lua b/prod/upload.lua new file mode 100644 index 0000000..0d08a4a --- /dev/null +++ b/prod/upload.lua @@ -0,0 +1,89 @@ +local upload = require "resty.upload" +local uuid = require "resty.jit-uuid" +local cjson = require "cjson" + +local chunk_size = 4096 +local form = upload:new(chunk_size) +uuid.seed() + +TaskTypes = { + NOOP = 'NOOP', + UPLOAD_PICTURE = 'UPLOAD_PICTURE' +} + +local task_server = ngx.var.task_server +local file_dir = ngx.var.tmp_file_dir +local file +local file_name +local files = {} + +while true do + local typ, res, err = form:read() + + if not typ then + ngx.say("failed to read: ", err) + return + end + + if typ == "header" then + + --"Content-Disposition","form-data; name=\"files[]\"; filename=\"Song-of-joy.png\"" + --"Content-Type","image\/png" + local key = res[1] + local val = res[2] + if key == "Content-Type" then + local ext = ngx.re.match(val, [[(\w+)\/(\w+)]], "jo")[2] + file_name = uuid() .. "." .. ext + end + + if file_name then + file = io.open(file_dir .. "/" .. file_name, "w+") + ngx.log(ngx.INFO, "FILENAME -> ", file_name) + if not file then + ngx.say("failed to open file ", file_name) + return + end + end + + elseif typ == "body" then + if file then + file:write(res) + -- sha1:update(res) + end + elseif typ == "part_end" then + if file then + file:close() + table.insert(files, file_name) + end + -- 这里要重置一下file_name,否则后面的文件保存时会导致前面已保存的文件变成空文件 + -- file:flush() 和 io.flush() 都没效果 + file_name = nil + file = nil + elseif typ == "eof" then + local http = require "resty.http" + local httpc = http.new() + local remote_url = string.format("%s/api/v1/ts/create_task", task_server) + ngx.log(ngx.INFO, 'remote_url -> ', remote_url) + ngx.log(ngx.INFO, 'authorization -> ', ngx.req.get_headers().Authorization) + local res, err = httpc:request_uri( + remote_url, + { + method = "POST", + headers = { + ["Content-Type"] = "application/json", + ["Authorization"] = ngx.req.get_headers().Authorization + }, + body = cjson.encode({task_type = TaskTypes.UPLOAD_PICTURE, data = {images = files}}), + } + ) + if 201 ~= res.status then + ngx.log(ngx.ERR, "create task failed", err) + ngx.say(err) + ngx.exit(res.status) + end + ngx.say(res.body) + break + else + -- do nothing + end +end