【发布时间】:2020-09-17 02:35:38
【问题描述】:
我们使用 Nginx + Lua 并希望根据this 解决方法支持分块上传,这通常是有效的。我的问题是如何像往常一样处理上传请求 - 使用标头、正文、eof:
local form, err = 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
while true do
local typ, res, err = form:read()
if not typ then
ngx.say("failed to read: ", err)
return
end
ngx.say("read: ", cjson.encode({typ, res}))
if typ == "eof" then
break
end
end
当我将上传标头 -H "Transfer-Encoding: chunked" 分块时,使用该 chunk 脚本。
对不起,如果这是显而易见的事情,但经过几天的谷歌搜索后,我没有看到任何示例。 但我的建议是:
# read headers
ngx.req.get_headers()
#read body:
ngx.req.get_body_data()
然后我不需要form:read() 并遍历表单数组直到eof。感谢任何链接、示例。
卷曲示例:
curl -X PUT localhost:8080/test -F file=@./myfile -H "Transfer-Encoding: chunked"
【问题讨论】:
-
为了清楚起见——分块传输编码使用 with form-data(我的意思是,首先上传的文件使用 multipart/form-data 编码,然后是请求正文,即表单,是使用分块传输编码进行编码的)还是与原始文件一起使用的分块传输编码(即,没有表单数据)?
-
现在只是一个带有标题
-H "Transfer-Encoding: chunked"的文件请求 -
因此,根据请求标头,您希望解码分块正文并将其视为上传文件(如果存在
transfer-encoding: chunked标头)或从multipart/form-data的某些部分提取上传文件(如果content-type: multipart/form-data存在),我理解正确吗? -
我们以 multipart 方式只加载一个文件,并希望按块发送(
-H "Transfer-Encoding: chunked") -
嗯,我需要再次澄清一下。您的 HTTP 客户端将一个文件作为 multipart/form-data 表单的一部分发送,并且请求正文(即表单本身)使用分块编码进行编码。因此,客户端应发送以下两个标头:
content-type: multipart/form-data和transfer-encoding: chunked。对吗?
标签: rest nginx lua chunked-encoding openresty