使用带有请求的multipart / form-data的POST的python设置边界

时间:2016-03-29 14:03:18

标签: python http post python-requests

我想使用请求发送文件,但服务器使用设置为*****的固定边界。我只能发送文件,但requests模块会创建一个随机边界。我该如何覆盖它?

import requests

url='http://xxx.xxx.com/uploadfile.php'
fichier= {'uploadedfile':open('1103290736_2016_03_23_13_32_55.zip','rb')}
headers2={'Connection':'Keep-Alive','User-Agent':'Dalvik/1.6.0 (Linux; U; Android 4.4.2; S503+ Build/KOT49H)','Accept-Encoding':'gzip'}
session= requests.Session()
session.post(url,headers=headers2,files=fichier)
session.close()

3 个答案:

答案 0 :(得分:1)

男孩,那是一个非常破碎的服务器。如果可以,请修改服务器。

你无法告诉requests选择哪个边界。您可以使用email.mime package

构建自己的multipart/form-data有效负载
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

related = MIMEMultipart('form-data', '*****')  # second argument is the boundary.
file_part = MIMEApplication(
    open('1103290736_2016_03_23_13_32_55.zip', 'rb').read(),
    # optional: set a subtype: 'zip',
)
file_part.add_header('Content-disposition', 'form-data; name="uploadedfile"')
related.attach(file_part)

body = related.as_string().split('\n\n', 1)[1]
headers = dict(related.items())
headers['User-Agent'] = 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; S503+ Build/KOT49H)'

r = session.post(url, data=body, headers=headers)

这会将Content-Type: multipart/form-data; boundary="*****"设置为标题,并且正文使用*****作为边界(使用适当的--前缀和后缀)。

答案 1 :(得分:0)

一个简单的替代方案是使用requests-toolbelt;以下示例取自此GitHub issue thread

from requests_toolbelt import MultipartEncoder

fields = {
# your multipart form fields
}

m = MultipartEncoder(fields, boundary='my_super_custom_header')
r = requests.post(url, headers={'Content-Type': m.content_type}, data=m.to_string())

但是,这会引入额外的依赖关系,可以是slow to upload large files

答案 2 :(得分:0)

您实际上可以直接使用请求模块执行此操作:

files = {'file': ('filename', open('filename', 'rb'), 'text/plain')}
body, content_type = requests.models.RequestEncodingMixin._encode_files(files, {})

# this way you ensure having the same boundary defined in
# the multipart/form-data contetn-type header
# the form-data

data = body
headers = {
    "Content-Type": content_type
}
response = requests.post(
    endpoint,
    data=data,
    headers=headers
)

这对我有用。否则我会收到这样的错误:

“ errorMessage”:“所需的请求部分'file'不存在”