我正在尝试配置 nginx 以支持文件上传。我正在使用描述的方法这里。我的nginx.conf
样子是:
location /upload {
limit_except POST { deny all; }
client_body_temp_path /tmp;
client_body_in_file_only on;
client_body_buffer_size 128K;
client_max_body_size 20G;
return 201 $request_body_file;
}
这里的想法是,通过打开client_body_in_file_only
,每个请求都会直接保存到磁盘。同时,保存的文件名也会返回给客户端。
我可以使用 cURL 上传文件并看到它们被完整地传输:
$ curl -i -F "[email protected]" http://server/upload > out.txt
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 3053k 0 0 100 3053k 0 7874k --:--:-- --:--:-- --:--:-- 7889k
该文件大小为 3 MB,确实传输了 3 MB。响应为:
$ cat out.txt
HTTP/1.1 100 Continue
HTTP/1.1 201 Created
Server: nginx/1.13.4
Date: Tue, 22 Aug 2017 04:21:48 GMT
Content-Type: text/plain
Content-Length: 0
Connection: keep-alive
请注意,我在响应主体中没有收到文件名。那么服务器上的 下什么都没有/tmp/
。上传的文件去哪儿了?
答案1
我能够使用ngx_echo
模块。关键是echo_read_request_body
指令,顾名思义,明确读取请求主体。
删除该行
return 201 $request_body_file;
并将其替换为
echo_read_request_body;
echo $request_body_file;
成功了!