resty.upload 处理上传的图片 并把生成的url保存到数据库中

--相关信息修改上传头像
local upload = require "resty.upload"
local cjson = require "cjson.safe"
local new_mysql = require("new_mysql")
local uuid = require "jit-uuid"
uuid.seed()

local chunk_size = 4096 --如果不设置默认是4096
local form = upload:new(chunk_size)
if not form then
ngx.log(ngx.ERR, "failed to new upload: ", err)
ngx.exit(500)
end
form:set_timeout(1000) --1 sec

local file

--["header",["Content-Disposition","form-data; name=\"headImg\"; filename=\"1\"","Content-Disposition: form-data; name=\"headImg\"; filename=\"1\""]]
--获取文件名
function get_filename( res )
local filename = ngx.re.match(res, '(.+)filename="(.+)"(.*)')
if filename then
return filename[2]
end
end

--获取文件扩展名
function getExtension( str )
return str:match(".+%.(%w+)$")
end

--["header",["Content-Disposition","form-data; name=\"userid\"","Content-Disposition: form-data; name=\"userid\""]]
--获取userid
function get_userid( res )
local filename = ngx.re.match(res, '(.+)name="(.+)"(.*)')
if filename then
if filename[2] == "userid" then
return "userid"
end
end
end

--上传成功的头像url存入数据库
local function _insertDataBaseWithImageUrl( url , userid)
local mysql = new_mysql:new({})
local sqlstr = string.format("UPDATE `BasketballDatabase`.`User` SET `head_img`='%s' WHERE `userid`='%s'",url, userid)
local res, err = mysql:query(sqlstr)
if res then
return 0
else
ngx.log(ngx.ERR, "query error:", err)
return -1
end
end


local var = ngx.var
local result = {}
result.result = 1

--/usr/local/openresty/nginx/html/文件夹必须是nobody权限,否则不能写文件,报错。
--chown nobody:nobody /usr/local/openresty/nginx/html
-- local osfilepath = "/Users/xinshaofeng/Work/BasketballServer/upload/"
local i = 0
local file = nil
local useridkey = nil
local useridvalue = nil
local image_name = nil

while true do
local typ, res, err = form:read()
-- ngx.say("read: ", cjson.encode({typ, res}))
if not typ then
result.msg = "failed to read:"..err
break
end
if typ == "header" then
-- ngx.say("read: ", cjson.encode({typ, res}))
if res[1] ~= "Content-Type" then
useridkey = get_userid(res[2])

local filename = get_filename(res[2])
--local extention = getExtension(filename)
--local filepath = osfilepath..file_id.."."..extention
if filename then
local osfilepath = var.upload_head_path --用的conf里面upload_head_path
image_name = uuid()
i=i+1
local filepath = osfilepath .. "/user/" .. image_name .. ".png"
file = io.open(filepath,"w+")
if not file then
result.msg = "failed to open file "
break
end
end
end
elseif typ == "body" then
if useridkey then
useridvalue = res
end

if file then
file:write(res)
end
elseif typ == "part_end" then
ngx.say("read:userid ",userid)
if useridkey then
useridkey = nil
end

if file then
file:close()
file = nil

local image_url = var.request_image_url.."/user/"..image_name .. ".png"

--插入数据库
local ok = _insertDataBaseWithImageUrl(image_url, useridvalue)
if ok == 0 then
result.result = 0
result.msg = "file upload success"
result.url = image_url
else
result.msg = "insert database failed"
end
end
elseif typ == "eof" then
break
else
-- do nothing
end
end

if i==0 then
result.msg = "please upload at least ont file!"
end

ngx.say(cjson.encode(result))
ngx.exit(ngx.HTTP_OK)

 

//curl 模拟上传图片

curl -F file=/Users/xinshaofeng/Work/BasketballServer/upload/headImg.png -F userid=1 http://127.0.0.1:8088/user_headupload

//命令行的输出

read: ["header",["Content-Disposition","form-data; name=\"file\"","Content-Disposition: form-data; name=\"file\""]]

read: ["body","\/Users\/xinshaofeng\/Work\/BasketballServer\/upload\/headImg.png"]

read: ["part_end"]

read: ["header",["Content-Disposition","form-data; name=\"userid\"","Content-Disposition: form-data; name=\"userid\""]]

read: ["body","1"]

read: ["part_end"]

read: ["eof"]

转载于:https://www.cnblogs.com/xilanglang/p/6697923.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值