我有一个客户,他的客户使用第三方清算所接收发票。我们可以通过将数据导出为 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
表单内的操作只是确保输入不directory
为file
空。
答案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 的登录页面。