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

是否可以从管道上载带有cURL的文件?,curl,upload,pipe,stdin,fifo,Curl,Upload,Pipe,Stdin,Fifo,我的意思是发布一个标准的文件上传表单。在这种情况下,常用命令行包含此开关: -F "Filedata=@filename.zip" 但是,当我尝试为linux命令“mkfifo”生成的命名管道(例如“mkfifo filename.zip”)馈电时,我总是在生产者端收到一条错误消息: curl: (23) Failed writing body (1856 != 16384) fifo的用户端也会出现一些错误消息。我在生产者端用另一个curl命令输入fifo,例如: curl http:/

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

-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的消费者端传递内容长度HTTP头时,我在生产者端没有收到错误消息,但消费者(上传)端仍会出现错误消息,上传不成功

 curl http://example.com/fileupload.php -F "file=@filename.zip" -H "Content-Length: 393594678"
我还尝试将cURL文件上传到一个未命名的管道,导致cURL从stdin(标记为@-)读取数据,如:

在本例中,上载成功,但下载和上载进度不同步,我可以看到太多单独的哈希标记进度指示器,一个用于下载,一个用于上载,而是连续的,不同时运行。在该远程文件的顶部,该文件始终命名为“-”,但这对我来说不是问题,可以稍后重命名

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

system %Q{curl -# http://example.com/archive.zip | curl -# http://example.com/fileupload.php -F "file=@-"}
在这种情况下,我只能看到一个hashmark进度指示器,因此我认为管道应该是这样工作的,但在第二种情况下,我可以看到两个连续的hashmark进度指示器,如下所示:

%x{curl -# http://example.com/archive.zip | curl -# http://example.com/fileupload.php -F "file=@-"}
是的,这是可能的

默认情况下,curl将检查所有提供的参数,计算出所有相关组件(包括文件)的大小,并在构造的POST请求中发送它们。这意味着curl将检查本地文件的大小,从而在使用fifo时中断。所以你需要做点什么

为先进先出而分块 通过告诉curl它应该使用分块编码来完成POST,而不是提前提供完整的大小,curl将以流式方式读取文件,只允许它在读取文件(fifo)时显示为所需的大小

您可以通过设置chunked头来实现这一点,curl将其用作执行请求分块的信号

curl -H "Tranfer-Encoding: chunked" -F file=@fifo https://example.com
警告 这不是curl的默认行为的原因是,这要求接收方使用HTTP/1.1或更高版本(curl在从服务器获得响应之前不知道)。旧的HTTP/1.0服务器不说“块”

来自stdin的formpost
从stdin执行formpost时,curl将首先在内存中读取stdin中的整个文件,然后再执行POST,以获取内容的大小,以便将其包含在POST请求中。

Thx。如果可以将文件大小作为命令行选项传递,那就更好了,因为在许多情况下,它是已知的。例如,当我从HTTP url馈送FIFO时。首先可以从文件所在的http服务器查询文件大小。在许多网站(例如视频共享网站,其中有文件大小限制)上禁用分块上传,因此不幸的是,在这些情况下不能选择分块上传。
curl -H "Tranfer-Encoding: chunked" -F file=@fifo https://example.com