如何使python请求上传到文件上传表单

时间:2019-01-08 13:50:07

标签: python file-upload python-requests

使用requests模块在HTML页面上通过此上载文件表单上载文件的正确方法是什么?我尝试使用以下代码,但不确定如何将表单包含到我的Python代码中?

HTTPDigestAuth登录正常,我从远程站点获得200 OK。

#!/usr/bin/env python3

import requests
from requests.auth import HTTPDigestAuth


with requests.Session() as s:
    url = "http://192.168.1.1/updatesettings.html"
    r = s.get(url, auth=HTTPDigestAuth('admin', '123456'))
    if r.status_code == 200:
        fin = open('backupsettings.conf', 'rb')
        files = {'file': fin}
        s.post(url, files=files)
    else:
        print("Login failed")

HTML格式如下

     <form method='post' ENCTYPE='multipart/form-data' action='uploadsettings.cgi' onSubmit='return isInProgress();'>
        <b>Tools -- Update Settings</b><br>
        <br>
        Update Broadband Router settings. You may update your router settings using your saved files.<br>
        <br>
        <table border="0" cellpadding="0" cellspacing="0">
           <tr>
              <td>Settings File Name:&nbsp;
              </td>
              <td><input type='file' name='filename' size='15'></td>
           </tr>
        </table>
        <p align="center"><input type='submit' value='Update Settings'></p>     
     </form> 

现在我得到“ ConnectionResetError:[Errno 104]对等重置连接”。但这可能是由于我没有指定正确的参数和内容,因此如果我排除POST内容,则登录工作正常。

1 个答案:

答案 0 :(得分:0)

检查表单中的操作参数和代码中的url,第一个是“ .cgi”,另一个是“ .html”,请确保您的请求标头也包含正确的“ enctype”。错误104是因为服务器对错误的请求进行了错误处理,从而终止了连接。 使用它来调试请求,并查看发送到服务器的确切信息。

import logging
try:
    import http.client as http_client
except ImportError:
    # Python 2
    import httplib as http_client
http_client.HTTPConnection.debuglevel = 1
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True