med*_*cre 4 python python-requests
我正在努力使用python requests提交特定表单。我想使用它的网站上的其他表单工作正常,我可以提交登录表单等。这只是我遇到问题的文件上传。显然,提交表单效果很好,因为我从网站收到一条消息,说“请返回并选择至少一个要上传的图像文件”。但该文件未发布到该网站。
如果我使用 Firefox 插件 Tamperdata 查看请求,在提交空表单后,它看起来像这样:
-----------------------------201075691119887339851216603987\r
Content-Disposition: form-data; name="userfile[]"; filename=""\r
Content-Type: application/octet-stream\r
\r
\r
-----------------------------201075691119887339851216603987\r
Content-Disposition: form-data; name="userfile[]"; filename=""\r
Content-Type: application/octet-stream\r
\r
\r
-----------------------------201075691119887339851216603987\r
Content-Disposition: form-data; name="userfile[]"; filename=""\r
Content-Type: application/octet-stream\r
\r
\r
-----------------------------201075691119887339851216603987\r
Content-Disposition: form-data; name="userfile[]"; filename=""\r
Content-Type: application/octet-stream\r
\r
\r
-----------------------------201075691119887339851216603987\r
Content-Disposition: form-data; name="userfile[]"; filename=""\r
Content-Type: application/octet-stream\r
\r
\r
-----------------------------201075691119887339851216603987\r
Content-Disposition: form-data; name="upload_to"\r
\r
0\r
-----------------------------201075691119887339851216603987\r
Content-Disposition: form-data; name="upload_type"\r
\r
standard\r
-----------------------------201075691119887339851216603987--\r
Run Code Online (Sandbox Code Playgroud)
(我用换行符替换了所有 \n 以使其更具可读性)
我的 python 上传代码如下所示:
index = s.get("https://example.com/")
file = {'userfile[]': open('tmp/cover/cover.jpg', 'rb')}
res = s.post(url='https://example.com/upload.php',
data=file,
headers={'Content-Type': 'application/octet-stream'})
Run Code Online (Sandbox Code Playgroud)
HTML 表单如下所示:
<form action="upload.php" method="post" id="upload_form" enctype="multipart/form-data">
<p>
<input name="userfile[]" type="file" size="30"> <br>
<input name="userfile[]" type="file" size="30"> <br>
<input name="userfile[]" type="file" size="30"> <br>
<input name="userfile[]" type="file" size="30"> <br>
<input name="userfile[]" type="file" size="30"> <br>
<span id="more_file_inputs"></span>
<br>
<span id="upoptions_hidden">
Uploading Options: <a href="javascript:void(0);" onclick="toggle('upoptions_hidden'); toggle('upoptions_shown');">Show</a>
</span>
<span id="upoptions_shown" style="display: none;">
Uploading Options: <a href="javascript:void(0);" onclick="toggle('upoptions_hidden'); toggle('upoptions_shown');">Hide</a>
<br><br>
Upload to:
<select name="upload_to">
<option value="0">Root Album</option>
</select>
<br><br>
Output Layout: <input type="radio" name="upload_type" value="standard" checked="checked"> <span onclick="toggle_lightbox('index.php?layoutprev=std', 'upload_layout_preview_lightbox');" title="Click to preview" class="help">Standard</span> <input type="radio" name="upload_type" value="normal-boxed"> <span onclick="toggle_lightbox('index.php?layoutprev=bx', 'upload_layout_preview_lightbox');" title="Click to preview" class="help">Boxed</span>
</span>
<br><br>
<input class="button1" type="button" value="Add File" onclick="new_file_input();">
<input class="button1" style="font-weight:bold;" type="button" value="Start Upload" onclick="toggle_lightbox('index.php?act=upload_in_progress', 'progress_bar_lightbox'); $('form[id=upload_form]').submit();">
</p>
</form>
Run Code Online (Sandbox Code Playgroud)
关于这里出了什么问题或者更好的调试方法有什么想法吗?谢谢你!
编辑:我刚刚意识到我并没有真正提交upload_type和upload_to字段,但即使我将它们设置为:
file = {'userfile[]': open('tmp/cover/cover.jpg', 'rb'), 'upload_to': '0', 'upload_type': 'standard'}
Run Code Online (Sandbox Code Playgroud)
它仍然不起作用。
使用files关键字进行上传,而不是data. 也不要设置内容类型标头;该表单作为多部分表单数据发布,请求应使用正确的内容类型:
res = s.post(
url='https://example.com/upload.php',
data={'upload_type': 'standard', 'upload_to': '0'},
files=file)
Run Code Online (Sandbox Code Playgroud)
并将其余表单字段放入 中的映射中data。
如果您想上传多个同名文件,请使用一系列文件:
files = {
'userfile[]': [
open('tmp/cover/cover1.jpg', 'rb'),
open('tmp/cover/cover2.jpg', 'rb'),
]
}
res = s.post(
url='https://example.com/upload.php',
data={'upload_type': 'standard', 'upload_to': '0'},
files=files)
Run Code Online (Sandbox Code Playgroud)
我发现您的代码有两个问题:
Content-Type: multipart/form-data; boundary=<blah>。files命名参数来上传文件,而不是data.使用:
res = s.post(url='https://example.com/upload.php',
data=<dict containing form params>,
files=file)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10509 次 |
| 最近记录: |