Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何发送一个";“多部分/表单数据”;用python处理请求?_Python_Python 2.7_Multipartform Data_Python Requests - Fatal编程技术网

如何发送一个";“多部分/表单数据”;用python处理请求?

如何发送一个";“多部分/表单数据”;用python处理请求?,python,python-2.7,multipartform-data,python-requests,Python,Python 2.7,Multipartform Data,Python Requests,如何用python发送带有请求的多部分/表单数据?如何发送文件,我理解,但是如何通过这种方法发送表单数据我不理解。基本上,如果指定文件参数(字典),那么请求将发送一个多部分/表单数据POST,而不是应用程序/x-www-form-urlencodedPOST。但是,您不限于使用该词典中的实际文件: >>> import requests >>> response = requests.post('http://httpbin.org/post', files=

如何用python发送带有请求的
多部分/表单数据
?如何发送文件,我理解,但是如何通过这种方法发送表单数据我不理解。

基本上,如果指定
文件
参数(字典),那么
请求
将发送一个
多部分/表单数据
POST,而不是
应用程序/x-www-form-urlencoded
POST。但是,您不限于使用该词典中的实际文件:

>>> import requests
>>> response = requests.post('http://httpbin.org/post', files=dict(foo='bar'))
>>> response.status_code
200
而httpbin.org让你知道你发布的标题是什么;在
response.json()
中,我们有:

>>> from pprint import pprint
>>> pprint(response.json()['headers'])
{'Accept': '*/*',
 'Accept-Encoding': 'gzip, deflate',
 'Connection': 'close',
 'Content-Length': '141',
 'Content-Type': 'multipart/form-data; '
                 'boundary=c7cbfdd911b4e720f1dd8f479c50bc7f',
 'Host': 'httpbin.org',
 'User-Agent': 'python-requests/2.21.0'}
更好的是,通过使用元组而不是单个字符串或字节对象,可以进一步控制每个部分的文件名、内容类型和附加头。元组应该包含2到4个元素;文件名、内容、可选的内容类型和可选的其他标题字典

我将使用带有
None
的元组形式作为文件名,以便从这些部分的请求中删除
filename=“…”
参数:

>>> files = {'foo': 'bar'}
>>> print(requests.Request('POST', 'http://httpbin.org/post', files=files).prepare().body.decode('utf8'))
--bb3f05a247b43eede27a124ef8b968c5
Content-Disposition: form-data; name="foo"; filename="foo"

bar
--bb3f05a247b43eede27a124ef8b968c5--
>>> files = {'foo': (None, 'bar')}
>>> print(requests.Request('POST', 'http://httpbin.org/post', files=files).prepare().body.decode('utf8'))
--d5ca8c90a869c5ae31f70fa3ddb23c76
Content-Disposition: form-data; name="foo"

bar
--d5ca8c90a869c5ae31f70fa3ddb23c76--
文件
也可以是两个值元组的列表,如果您需要排序和/或使用相同名称的多个字段:

requests.post(
    'http://requestb.in/xucj9exu',
    files=(
        ('foo', (None, 'bar')),
        ('foo', (None, 'baz')),
        ('spam', (None, 'eggs')),
    )
)
如果同时指定
文件
数据
,则这取决于创建帖子正文所用的
数据的值。如果
data
是一个字符串,则只使用它;否则将同时使用
数据
文件
,首先列出
数据
中的元素

还有优秀的
requests toolbelt
项目,其中包括。它采用与
文件
参数相同格式的字段定义,但与
请求
不同,它默认不设置文件名参数。此外,它可以从打开的文件对象流式传输请求,其中
请求
将首先在内存中构造请求主体:

from requests_toolbelt.multipart.encoder import MultipartEncoder

mp_encoder = MultipartEncoder(
    fields={
        'foo': 'bar',
        # plain file object, no filename or mime type produces a
        # Content-Disposition header with just the part name
        'spam': ('spam.txt', open('spam.txt', 'rb'), 'text/plain'),
    }
)
r = requests.post(
    'http://httpbin.org/post',
    data=mp_encoder,  # The MultipartEncoder is posted as data, don't use files=...!
    # The MultipartEncoder provides the content-type header with the boundary:
    headers={'Content-Type': mp_encoder.content_type}
)

字段遵循相同的约定;使用包含2到4个元素的元组添加文件名、部分mime类型或额外的头。与
files
参数不同,如果不使用元组,则不会尝试查找默认的
filename
值。

自从编写了以前的答案后,请求已更改。有关更多详细信息和示例,请查看

简而言之,files参数采用
dict
,键为表单字段的名称,值为字符串或2、3或4长度元组,如请求快速启动中的部分所述:

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
在上面,元组的组成如下:

(filename, data, content_type, headers)
如果该值只是一个字符串,则文件名将与键相同,如下所示:

>>> files = {'obvius_session_id': '72c2b6f406cdabd578c5fd7598557c52'}

Content-Disposition: form-data; name="obvius_session_id"; filename="obvius_session_id"
Content-Type: application/octet-stream

72c2b6f406cdabd578c5fd7598557c52
如果该值为元组,且第一个条目为
None
,则不会包括filename属性:

>>> files = {'obvius_session_id': (None, '72c2b6f406cdabd578c5fd7598557c52')}

Content-Disposition: form-data; name="obvius_session_id"
Content-Type: application/octet-stream

72c2b6f406cdabd578c5fd7598557c52

即使您不需要上传任何文件,也需要使用
files
参数发送多部分表单POST请求

从原始来源:

def请求(方法、url、**kwargs):
“”“构造并发送:类:`Request`。
...
:param files:(可选)名称字典:类似文件的对象``
(或``{'name':文件元组}```用于多部分编码上载。
``文件元组``可以是2元组`('filename',fileobj)`,
三元组“`('filename',fileobj,'content\u type')``
或者一个4元组“`('filename',fileobj,'content\u type',custom\u headers)``,
其中,``content-type``是一个字符串
定义给定文件的内容类型
“自定义”标题是类似dict的对象
包含要为文件添加的其他标头。
相关部分是:
文件元组可以是一个
<2-元组
<3-元组
或一个
<4-元组

基于上述内容,最简单的多部分表单请求(包括要上载的文件和表单字段)如下所示:

多部分表单数据={
'file2':('custom_file_name.zip',open('myfile.zip','rb'),
“操作”:(无,“存储”),
“路径”:(无,/path1”)
}
response=requests.post('https://httpbin.org/post,files=multipart_form_data)
打印(response.content)
☝ 请注意,
None
作为纯文本字段元组中的第一个参数-这是文件名字段的占位符,仅用于文件上载,但对于传递
None
的文本字段,作为提交数据所需的第一个参数

具有相同名称的多个字段 如果需要发布具有相同名称的多个字段,则可以将负载定义为元组列表(或元组),而不是字典:

multipart_form_data = (
    ('file2', ('custom_file_name.zip', open('myfile.zip', 'rb'))),
    ('action', (None, 'store')),
    ('path', (None, '/path1')),
    ('path', (None, '/path2')),
    ('path', (None, '/path3')),
)

流式处理请求API

如果上述API对您来说不是足够的Python,那么考虑使用(<代码> PIPStestRealStestSuthSooStope),该模块是支持文件上传流的模块的扩展,并且可以用来代替“代码>文件< /代码>,也允许您将有效载荷定义为字典、元组或列表。

multipartincoder
可用于包含或不包含实际上载字段的多部分请求。它必须分配给
数据
参数

导入请求
从请求\u toolbelt.multipart.encoder导入multipartincoder
多部分数据=多部分编码器(
田地={
#文件上载字段
'file':('file.zip',open('file.zip','rb'),'text/plain')
#纯文本字段
“field0”:“value0”,
“字段1”:“值1”,
}
)
response=requests.post('http://httpbin.org/post,data=multipart_data,
headers={'Content-Type':多部分数据.Content\u-Type})
如果需要发送多个同名字段,或者表单字段的顺序很重要,则
multipart_data = MultipartEncoder(
    fields=(
            ('action', 'ingest'), 
            ('item', 'spam'),
            ('item', 'sausage'),
            ('item', 'eggs'),
           )
    )
autocomplete="off" name="image">
import requests

site = 'https://prnt.sc/upload.php' # the site where you upload the file
filename = 'image.jpg'  # name example
up = {'image':(filename, open(filename, 'rb'), "multipart/form-data")}
data = {
     "Button" : "Submit",
}
request = requests.post(site, files=up, data=data)
import requests
latest_file = 'path/to/file'
url = "http://httpbin.org/apiToUpload"
files = {'fieldName': open(latest_file, 'rb')}
r = requests.put(url, files=files)
var upload = multer().single('fieldName');
url = 'https://<file_upload_url>'
fp = '/Users/jainik/Desktop/data.csv'

files = {'file': open(fp, 'rb')}
payload = {'file_id': '1234'}

response = requests.put(url, files=files, data=payload, verify=False)
# -*- coding: utf-8 *-*
import json, requests

URL_SERVER_TO_POST_DATA = "URL_to_send_POST_request"
HEADERS = {"Content-Type" : "multipart/form-data;"}

def getPointsCC_Function():
  file_data = {
      'var1': (None, "valueOfYourVariable_1"),
      'var2': (None, "valueOfYourVariable_2")
  }

  try:
    resElastic = requests.post(URL_GET_BALANCE, files=file_data)
    res = resElastic.json()
  except Exception as e:
    print(e)

  print (json.dumps(res, indent=4, sort_keys=True))

getPointsCC_Function()
files={"foo": "bar"}
url = "https://my-bitbucket.com/rest/api/latest/projects/FOO/repos/bar/browse/foobar.txt"
payload = {'branch': 'master', 
           'content': 'text that will appear in my file',
           'message': 'uploading directly from python'}
files = {"foo": "bar"}
response = requests.put(url, data=payload, files=files)
import requests
# assume sending two files
url = "put ur url here"
f1 = open("file 1 path", 'rb')
f2 = open("file 2 path", 'rb')
response = requests.post(url,files={"file1 name": f1, "file2 name":f2})
print(response)
import http.client
import mimetypes
from codecs import encode

conn = http.client.HTTPSConnection("data.XXXX.com")
dataList = []
boundary = 'wL36Yn8afVp8Ag7AmP8qZ0SA4n1v9T'
dataList.append(encode('--' + boundary))
dataList.append(encode('Content-Disposition: form-data; name=batchSize;'))

dataList.append(encode('Content-Type: {}'.format('text/plain')))
dataList.append(encode(''))

dataList.append(encode("1"))
dataList.append(encode('--' + boundary))
dataList.append(encode('Content-Disposition: form-data; name=file; filename={0}'.format('FileName-1.json')))

fileType = mimetypes.guess_type('FileName-1.json')[0] or 'application/octet-stream'
dataList.append(encode('Content-Type: {}'.format(fileType)))
dataList.append(encode(''))

with open('FileName-1.json', 'rb') as f:
  dataList.append(f.read())
dataList.append(encode('--'+boundary+'--'))
dataList.append(encode(''))
body = b'\r\n'.join(dataList)
payload = body
headers = {
  'Cookie': 'XXXXXXXXXXX',
  'Content-type': 'multipart/form-data; boundary={}'.format(boundary)
}
conn.request("POST", "/fileupload/uri/XXXX", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))