使用cURL从Shell发布4GB文件

Nil*_*ils 3 shell curl

我尝试将文件大小为4GB的文件发布到REST API。

cURL不会上传具有该大小的文件,而是发布Content-Length:0的文件。

curl -v -i -d @"/work/large.png" -H "Transfer-Encoding: chunked" http://localhost:8080/files
* Adding handle: conn: 0x7fcafc00aa00
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7fcafc00aa00) send_pipe: 1, recv_pipe: 0
* About to connect() to localhost port 8080 (#0)
*   Trying localhost...
* Connected to localhost (localhost) port 8080 (#0)
> POST /files HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:8080
> Accept: */*
> Transfer-Encoding: chunked
> Authorization: bearer XXX.XXX.XXX
> x-user-token: bearer XXX.XXX.XXX
* upload completely sent off: 5 out of 0 bytes
< HTTP/1.1 201 Created
HTTP/1.1 201 Created
< Date: Thu, 02 Jan 2014 14:55:46 GMT
Date: Thu, 02 Jan 2014 14:55:46 GMT
< ETag: "d41d8cd98f00b204e9800998ecf8427e"
ETag: "d41d8cd98f00b204e9800998ecf8427e"
< Location: http://localhost:8080/files/66032e34-9490-4556-8495-fb485ca12811
Location: http://localhost:8080/files/66032e34-9490-4556-8495-fb485ca12811
* Server nginx/1.4.1 is not blacklisted
< Server: nginx/1.4.1
Server: nginx/1.4.1
< Content-Length: 0
Content-Length: 0
< Connection: keep-alive
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)

使用较小的文件将按预期工作。

-rw-r--r--  1 user1  wheel  4403200000  2 Jan 15:02 /work/large.png
Run Code Online (Sandbox Code Playgroud)

为什么上传失败?而且,如何正确上传这样的文件?

干杯。

小智 8

我认为您应该考虑使用-Toption而不是--data-binary。将--data-binary整个文件加载到内存中(curl 7.47)。充其量是缓慢的,最糟糕的是OOM杀手会回复一条Killed消息。

curl -XPOST -T big-file.iso https://example.com
Run Code Online (Sandbox Code Playgroud)


jb.*_*jb. 5

要使用 CURL 上传大型二进制文件,您需要使用--data-binaryflag。

就我而言,是:

 curl -X PUT --data-binary @big-file.iso https://example.com
Run Code Online (Sandbox Code Playgroud)

注意:这实际上是 @KarlC 评论的扩展版本,这实际上是正确的答案。