如何使用“curl”而不是表单上传文件?

Chu*_*uck 2 curl

我有一个客户,他的客户使用第三方票据交换所来接收发票。我们可以通过将数据导出到 XML、访问特定网站并上传文件来手动完成此操作。相关的 HTML 表单如下所示:

<form border=0
      method="POST"
      action="/server?request=send"
      enctype="multipart/form-data"
      id="uploadform"
      name="uploadform"
      onsubmit="return checkUpload()">
  <H2>Upload</H2>
  <p>Server directory:<br>
  <input type="text"
         id="directory"
         name="directory"
         value="./"
         size="30"></p>
  <p>Local file to be uploaded:<br>
  <input type="file"
         id="file"
         name="file"
         size="40"></p>
  <p><input type="submit" value="Send"></p>
</form>
Run Code Online (Sandbox Code Playgroud)

使用他们的网络界面手动提交效果很好。我正在尝试编写一个快速工具,使用它为我们提交表单curl. 我尝试了很多不同的尝试,但到目前为止,每一次,虽然我得到“文件已成功上传”HTML 响应,但他们得到的文件是空的。

我们最初开始尝试使用,curl是因为票据交换所公司建议我们这样做。他们给出的例子是这样的:

curl -i -k -H "Content-Type:application/octet-stream" \
  -d @test.txt -u username:password \
  https://example.com/server?request=send?filename=test.txt?directory=DX001
Run Code Online (Sandbox Code Playgroud)

当这不起作用时,我开始查看上面表单中的代码,并尝试以下操作(与 XML 文件位于同一目录中):

curl -F "request=send" -F "directory=DX001" -F "file=33823.xml" \
  -u username:password -F "enctype=\"multipart/form-data\"" \
  -F "id=\"uploadform\"" https://example.com/server
Run Code Online (Sandbox Code Playgroud)

不起作用时,我想我应该尝试绝对路径,即使我位于同一目录中:

curl -F "request=send" -F "directory=DX001" -F "file=/Users/chuck/Desktop/33823.xml" \
  -u username:password -F "enctype=\"multipart/form-data\"" \
  -F "id=\"uploadform\"" https://example.com/server
Run Code Online (Sandbox Code Playgroud)

其中每一个都只上传一个空文件(具有给定的文件名)。

您可能可以从完整路径中看出,我是在 macOS 上执行此操作,以防相关。

请注意,onsubmit表单中的操作只是确保输入directoryfile输入都不为空。

use*_*686 5

其中每一个都只上传一个空文件(具有给定的文件名)。

Curl不知道哪些字段是常规文本,哪些字段是文件上传;除非您明确告诉它执行后者,否则它会假设前者。要附加整个文件,您需要@前缀:

-F "file=@/Users/chuck/Desktop/33823.xml"
Run Code Online (Sandbox Code Playgroud)

您可以为服务器提供不同的文件名,如下所示:

-F "file=@\"/Users/chuck/Desktop/temp.xml\";filename=\"33823.xml\""
Run Code Online (Sandbox Code Playgroud)

正确的完整命令应该是:

curl -u username:password \
     -F "directory=DX001" \
     -F "file=@/Users/chuck/Desktop/33823.xml" \
     https://example.com/server?request=send
Run Code Online (Sandbox Code Playgroud)

注意 howrequest=send不是表单数据的一部分它以前是 URL 的一部分,现在仍然是 URL 的一部分。最后,虽然您的示例都包含-u身份验证,但请记住它仅适用于 HTTP“基本”机制,不适用于基于表单/cookie 的登录页面。