是否可以从管道上传带有cURL的文件?

时间:2015-07-19 18:30:30

标签: curl upload pipe stdin fifo

我的意思是POST一个标准的文件上传表单。在这种情况下,常用命令行包含此开关:

-F "Filedata=@filename.zip"

但是,当我尝试输入由linux命令" mkfifo"制作的命名管道时,例如。 " mkfifo filename.zip",我总是在生产者方面收到错误消息:

curl: (23) Failed writing body (1856 != 16384)

并且在fifo的消费者端也会出现一些错误消息。我在生产者一方用另一个curl命令喂了我的fifo,例如:

 curl http://example.com/archive.zip > filename.zip

在消费者方面:

curl http://example.com/fileupload.php -F "file=@filename.zip"

当我在fifo的消费者端传递Content-Length HTTP标头时,我在生产者端没有收到错误消息,但是消费者(上传)端仍然出现错误消息,上传失败。

 curl http://example.com/fileupload.php -F "file=@filename.zip" -H "Content-Length: 393594678"

我还尝试过将cURL文件上传到一个非命名管道,导致cURL从stdin读取数据(标记为@ - ),如:

   curl -# http://example.com/archive.zip | curl -# http://example.com/fileupload.php -F "file=@-"

在这种情况下上传成功,但下载和上传进度不同步,我可以看到太单独的hashmark进度指示器,一个用于下载,一个用于上载,而是连续且不同时运行。在该远程文件的顶部始终命名为" - ",但这对我来说不是问题,可以稍后重命名。

进一步注意:我在Ruby命令行IRB / Pry会话中尝试了上述内容,我注意到当我使用Ruby命令" system"调用管道构造:

system %Q{curl -# http://example.com/archive.zip | curl -# http://example.com/fileupload.php -F "file=@-"}

在这种情况下,我只能看到一个散列标记进度指示器,所以我认为管道系统应该正常工作,但我可以在第二种情况下看到两个连续的散列标记进度指示器,如下所示:

%x{curl -# http://example.com/archive.zip | curl -# http://example.com/fileupload.php -F "file=@-"}

1 个答案:

答案 0 :(得分:1)

是的,有可能!

默认情况下,curl将检查所有提供的参数,找出所有涉及的组件(包括文件)的大小,并在构造的POST请求中发送它们。这意味着curl将检查本地文件的大小,因此在使用fifo时会中断。因此,您需要为此做些事情!

分块为fifo

通过告诉curl它应该使用分块编码来执行POST,而不是提前提供完整大小,curl会以流方式读取文件,并只允许将其调到所需的大小。文件(fifo)的读取时间。

您可以通过设置分块标题来实现此目的,curl将其用作执行分块请求的信号。

curl -H "Tranfer-Encoding: chunked" -F file=@fifo https://example.com

caveat

这不是curl的默认行为的原因是,这要求接收者使用HTTP / 1.1或更高版本(直到从服务器获取响应后,curl才知道)。旧的HTTP / 1.0服务器不会说“块”。

来自stdin的帖子

从stdin执行formpost时,curl将在执行POST之前先从内存中的stdin中读取整个文件,以获取内容的大小,以便可以将其包含在POST请求中。

相关问题