【问题标题】:POST 4GB file from shell using cURL使用 cURL 从 shell POST 4GB 文件
【发布时间】:2014-01-02 15:19:33
【问题描述】:

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

cURL 不会上传具有这种大小的文件,而是 POST 一个 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

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

-rw-r--r--  1 user1  wheel  4403200000  2 Jan 15:02 /work/large.png

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

干杯。

【问题讨论】:

  • 也许你需要-X POSTstackoverflow.com/a/11164871/1542000
  • 谢谢卡尔,但这无济于事。恕我直言,指定 -d 时,cURL 默认使用 POST。
  • 尝试--data-binary 而不是-d-d 默认为 --data-ascii,它不适用于 binary PNG 图像。
  • --data-binary 完美运行。非常感谢。
  • 嘿,@尼尔斯!也许您可以考虑在这里接受其中一个答案?这将帮助其他用户,因为它可以让他们知道什么对你有用。

标签: shell curl


【解决方案1】:

我认为您应该考虑使用-T 选项而不是--data-binary--data-binary 将整个文件加载到内存中(curl 7.47)。最好的情况是很慢,最坏的情况是OOM杀手会回复Killed消息。

curl -XPOST -T big-file.iso https://example.com

【讨论】:

  • 我很困惑。您建议使用-T 而不是--data-binary,下面的答案由@jb 提供。说--data-binary 是正确的做法吗?
  • 如果客户端有足够的内存将文件保存在内存中,那么--data-binary 可能是“正确的做法”。
【解决方案2】:

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

在我的情况下是:

 curl -X PUT --data-binary @big-file.iso https://example.com

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

【讨论】:

    【解决方案3】:

    您是否确认连接没有超时? 检查CURLOPT_POSTFIELDS has a length or size limit? 检查Can't post data to rest server using cURL with content length larger than 1MB

    但根据我的研究,我只能说,问题出在服务器端。现在它可能是内存问题(与缓冲区大小相关)、超时问题......而且很大程度上取决于您在服务器端使用的平台。所以,提供一些关于服务器端的细节和一些日志输出……尤其是尝试捕获错误日志。

    【讨论】:

    • 服务器端实际上并没有得到请求实体。即使我更改为远程服务器,也根本没有网络活动。我还尝试使用 Jersey 上传文件,它适用于相同的服务器后端。
    • 你可以先尝试一个较小的文件,看看它是否有效?比如说,小于 2 mb。如果可行,我们确信您的框架正在以某种形式运行。另外,请让我知道具有
    猜你喜欢
    • 1970-01-01
    • 2015-11-13
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多