是否可以从管道上传带有 cURL 的文件?
Is it possible to upload a file with cURL from a pipe?
我的意思是发布一个标准的文件上传表单。在这种情况下,通常的命令行包含此开关:
-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 header 时,我在生产者端没有收到错误消息,但错误消息仍然出现在消费者端(上传中)端,上传失败。
curl http://example.com/fileupload.php -F "file=@filename.zip" -H "Content-Length: 393594678"
我还尝试将 cURL 文件上传到 non-named 管道,导致 cURL 从标准输入(标记为 @-)读取数据,例如:
curl -# http://example.com/archive.zip | curl -# http://example.com/fileupload.php -F "file=@-"
本例上传成功,但是下载进度和上传进度不同步,我看到hashmark进度条太分离了,一个下载一个上传,比较连续,不是同时操作时间。上面那个远程文件总是命名为“-”,但这对我来说不是问题,以后可以重命名。
进一步注意:我从 Ruby 命令行 IRB / Pry session 尝试了上述操作,我注意到当我使用 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=@-"}
是的,这是可能的!
默认情况下,curl 将检查所有提供的参数,计算出所有涉及的组件(包括文件)的大小,并在构造的 POST 请求中发送它们。这意味着 curl 将检查本地文件的大小,因此当您使用 fifo 时会中断。因此,您需要为此做点什么!
为 fifo 分块
通过告诉 curl 它应该使用分块编码进行 POST 而不是提前提供完整大小,curl 将改为以流式方式读取文件并允许它变成任何内容读取文件 (fifo) 时所需的大小。
您可以通过设置分块 header 来做到这一点,curl 使用它作为执行分块请求的信号。
curl -H "Tranfer-Encoding: chunked" -F file=@fifo https://example.com
警告
这不是 curl 的默认行为的原因是这要求接收方使用 HTTP/1.1 或更高版本(curl 在从服务器返回响应之前不知道) ).旧 HTTP/1.0 服务器不支持 "chunk".
来自标准输入的表单
从 stdin 执行 formpost 时,curl 将首先在内存中从 stdin 读取整个文件,然后再执行 POST,以获取内容的大小,以便它可以将其包含在 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 header 时,我在生产者端没有收到错误消息,但错误消息仍然出现在消费者端(上传中)端,上传失败。
curl http://example.com/fileupload.php -F "file=@filename.zip" -H "Content-Length: 393594678"
我还尝试将 cURL 文件上传到 non-named 管道,导致 cURL 从标准输入(标记为 @-)读取数据,例如:
curl -# http://example.com/archive.zip | curl -# http://example.com/fileupload.php -F "file=@-"
本例上传成功,但是下载进度和上传进度不同步,我看到hashmark进度条太分离了,一个下载一个上传,比较连续,不是同时操作时间。上面那个远程文件总是命名为“-”,但这对我来说不是问题,以后可以重命名。
进一步注意:我从 Ruby 命令行 IRB / Pry session 尝试了上述操作,我注意到当我使用 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=@-"}
是的,这是可能的!
默认情况下,curl 将检查所有提供的参数,计算出所有涉及的组件(包括文件)的大小,并在构造的 POST 请求中发送它们。这意味着 curl 将检查本地文件的大小,因此当您使用 fifo 时会中断。因此,您需要为此做点什么!
为 fifo 分块
通过告诉 curl 它应该使用分块编码进行 POST 而不是提前提供完整大小,curl 将改为以流式方式读取文件并允许它变成任何内容读取文件 (fifo) 时所需的大小。
您可以通过设置分块 header 来做到这一点,curl 使用它作为执行分块请求的信号。
curl -H "Tranfer-Encoding: chunked" -F file=@fifo https://example.com
警告
这不是 curl 的默认行为的原因是这要求接收方使用 HTTP/1.1 或更高版本(curl 在从服务器返回响应之前不知道) ).旧 HTTP/1.0 服务器不支持 "chunk".
来自标准输入的表单
从 stdin 执行 formpost 时,curl 将首先在内存中从 stdin 读取整个文件,然后再执行 POST,以获取内容的大小,以便它可以将其包含在 POST请求。