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

如何使用“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>

使用他们的 Web 界面手动提交效果很好。我正在尝试编写一个快速工具,使用 为我们提交表单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

当那不起作用时,我开始查看上面形式的代码,并尝试以下操作(在与 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

什么时候没有用,我想我会尝试绝对路径,即使我在同一个目录中:

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

每一个都仅上传一个空文件(具有给定文件的名称)。

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

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

答案1

每一个都仅上传一个空文件(具有给定文件的名称)。

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

-F "file=@/Users/chuck/Desktop/33823.xml"

您可以为服务器指定一个不同的文件名,如下所示:

-F "file=@\"/Users/chuck/Desktop/temp.xml\";filename=\"33823.xml\""

正确的完整命令应该是:

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

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

相关内容