我有一个客户,他的客户使用第三方票据交换所来接收发票。我们可以通过将数据导出到 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表单中的操作只是确保输入directory和file输入都不为空。
其中每一个都只上传一个空文件(具有给定的文件名)。
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 的登录页面。
| 归档时间: |
|
| 查看次数: |
28738 次 |
| 最近记录: |