• 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"]

  • 相关阅读:
    Redis21:客户端与服务器端的通信与redis管道
    Redis20:keys、scan、bigkeys、查看key的存储方式
    Redis19:限流
    Redis18:分布式锁
    Redis17:cluster集群
    Redis16:两种redis集群解决方案:codis和cluster
    Android : 获取声卡信息的测试代码
    Android : 基于alsa库的音乐播放
    Android system :灯光系统_HAL_lights
    Android system :led_class驱动
  • 原文地址:https://www.cnblogs.com/xilanglang/p/6697923.html
Copyright © 2020-2023  润新知