如何使用python';s请求模块并自定义每个文件的标题?

如何使用python';s请求模块并自定义每个文件的标题?,python,python-requests,Python,Python Requests,从中,我可以找到自定义单个多部分编码文件的头的方法: 您可以显式设置文件名、内容类型和标题: 从中,我可以找到发送多个多部分编码文件的方法: 您可以在一个请求中发送多个文件…要做到这一点,只需设置 文件到元组列表(表单\字段\名称,文件\信息): 假设我想发送上述两张图片,但我想自定义第二张图片的标题。合理的做法是: multiple_files = [('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),

从中,我可以找到自定义单个多部分编码文件的头的方法:

您可以显式设置文件名、内容类型和标题:

从中,我可以找到发送多个多部分编码文件的方法:

您可以在一个请求中发送多个文件…要做到这一点,只需设置 文件到元组列表(表单\字段\名称,文件\信息):

假设我想发送上述两张图片,但我想自定义第二张图片的标题。合理的做法是:

multiple_files = [('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
                  ('images', ('bar.png', open('bar.png', 'rb'), 'image/png', {'Expires': '0'}))]
但是,我得到了以下错误:

In [49]: multiple_files = [('images', ('foo.png', "123", 'image/png')),
                           ('images', ('bar.png', "123", 'image/png', {'Expires': '0'}))]

In [50]: response = requests.post(
         url,
         headers={'accept': 'application/json'},
         files = multiple_files
         )
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-50-ef900c5109d7> in <module>()
      2         url,
      3         headers={'accept': 'application/json'},
----> 4         files = multiple_files
      5         )

/Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/api.pyc in post(url, data, **kwargs)
     86     """
     87
---> 88     return request('post', url, data=data, **kwargs)
     89
     90

/Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/api.pyc in request(method, url, **kwargs)
     42
     43     session = sessions.Session()
---> 44     return session.request(method=method, url=url, **kwargs)
     45
     46

/Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/sessions.pyc in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert)
    321             hooks = hooks,
    322         )
--> 323         prep = self.prepare_request(req)
    324
    325         proxies = proxies or {}

/Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/sessions.pyc in prepare_request(self, request)
    262             auth=merge_setting(auth, self.auth),
    263             cookies=merged_cookies,
--> 264             hooks=merge_setting(request.hooks, self.hooks),
    265         )
    266         return p

/Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/models.pyc in prepare(self, method, url, headers, files, data, params, auth, cookies, hooks)
    281         self.prepare_headers(headers)
    282         self.prepare_cookies(cookies)
--> 283         self.prepare_body(data, files)
    284         self.prepare_auth(auth, url)
    285         # Note that prepare_auth must be last to enable authentication schemes

/Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/models.pyc in prepare_body(self, data, files)
    411             # Multi-part file uploads.
    412             if files:
--> 413                 (body, content_type) = self._encode_files(files, data)
    414             else:
    415                 if data:

/Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/models.pyc in _encode_files(files, data)
    124                     fn, fp = v
    125                 else:
--> 126                     fn, fp, ft = v
    127             else:
    128                 fn = guess_filename(v) or k

ValueError: too many values to unpack
[49]中的
:多个_文件=[('images',('foo.png','123','image/png'),
('images',('bar.png','123','image/png',{'Expires':'0'}))]
在[50]中:response=requests.post(
网址,
headers={'accept':'application/json'},
文件=多个_文件
)
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
2网址,
3头文件={'accept':'application/json'},
---->4个文件=多个_文件
5         )
/post中的Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/api.pyc(url,数据,**kwargs)
86     """
87
--->88返回请求('post',url,data=data,**kwargs)
89
90
/请求中的Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/api.pyc(方法,url,**kwargs)
42
43 session=sessions.session()
--->44返回会话。请求(方法=方法,url=url,**kwargs)
45
46
/请求中的Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/sessions.pyc(self、方法、url、参数、数据、标题、cookie、文件、身份验证、超时、允许重定向、代理、挂钩、流、验证、证书)
321挂钩=挂钩,
322         )
-->323准备=自我准备请求(req)
324
325代理=代理或{}
/prepare_request(self,request)中的Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/sessions.pyc
262 auth=合并设置(auth,self.auth),
263 cookies=合并的\u cookies,
-->264 hooks=merge_设置(request.hooks、self.hooks),
265         )
266返回p
/prepare中的Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/models.pyc(self、方法、url、标题、文件、数据、参数、身份验证、cookie、钩子)
281.自行准备标题(标题)
282.自己准备饼干(饼干)
-->283自我准备机构(数据、文件)
284自我准备认证(认证,url)
285#请注意,prepare#u auth必须是最后一个才能启用身份验证方案
/prepare_body中的Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/models.pyc(self、data、files)
411#多部分文件上传。
412如果文件:
-->413(正文,内容类型)=自编码文件(文件,数据)
414其他:
415如果数据:
/文件(文件、数据)中的Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/models.pyc
124 fn,fp=v
125其他:
-->126 fn,fp,ft=v
127.其他:
128 fn=猜测文件名(v)或k
ValueError:要解压缩的值太多
我的问题是:
当存在多个文件时,我可以自定义单个文件的标题吗?

这是多部分HTTP请求的外观,除了多部分内容的
内容类型
内容处置
之外,所有标题都在开头(它们描述了内容)并且它们仅适用于顶级
内容类型
多部分/表单数据

POST /test HTTP/1.1 Host: host User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 Accept: text/html Accept-Language: en-us Accept-Charset: utf-8 Keep-Alive: 300 Connection: keep-alive Content-Type: multipart/form-data; boundary=---------------------------3141592654 Content-Length: 111 -----------------------------3141592654 Content-Disposition: form-data; name="image"; filename="foo.png" Content-Type: image/png [img-data] -----------------------------3141592654 Content-Disposition: form-data; name="image"; filename="bar.png" Content-Type: image/png [img-data] POST/test HTTP/1.1 主持人:主持人 用户代理:Mozilla/5.0(Windows NT 6.1)AppleWebKit/537.36(KHTML,如Gecko)Chrome/41.0.2228.0 Safari/537.36 接受:text/html 接受语言:en us 接受字符集:utf-8 活命:300 连接:保持活力 内容类型:多部分/表单数据;边界=------------------------------------3141592654 内容长度:111 -----------------------------3141592654 内容配置:表单数据;name=“image”;filename=“foo.png” 内容类型:图像/png [img数据] -----------------------------3141592654 内容配置:表单数据;name=“image”;filename=“bar.png” 内容类型:图像/png [img数据]
您不能有独立的标头,因为这些标头都作为单个请求发送,即只发送一组标头。标头用于包含多个文件的请求。您不能单独设置单个文件上的缓存,HTTP协议不支持。您需要将它们作为两个请求发送,或者设置ca不,不正确。我们还可以定义标题来描述我们发送的文件。下面是我使用nc(netcat)捕获的一个请求,我只显示一个exerpt,因为单词limit:someHTTPHeader…--207f7f98b35342ad90c292be8cd2f082内容处置:表单数据;name=“Content”;filename=“yoooo“内容类型:'application/octet stream'MTIz--207f7f98b35342ad90c292be8cd2f082--headers,我指的是像Content-Type.Yep这样的东西,如果我想做一些定制呢?例如,如果一个文件是base64编码的,我想提供一个头来详细说明它。具体来说:内容传输编码:base64。如果第二个图像是Base 64编码的,我如何为第二个图像添加此项?您可以这样做,并且被HTTP协议接受,您不能有
过期
或任何其他头,接受的三个头是
内容类型
内容处置
内容传输编码
。但是我不确定你如何通过
请求
做到这一点。你使用的是什么版本的
请求
In [49]: multiple_files = [('images', ('foo.png', "123", 'image/png')),
                           ('images', ('bar.png', "123", 'image/png', {'Expires': '0'}))]

In [50]: response = requests.post(
         url,
         headers={'accept': 'application/json'},
         files = multiple_files
         )
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-50-ef900c5109d7> in <module>()
      2         url,
      3         headers={'accept': 'application/json'},
----> 4         files = multiple_files
      5         )

/Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/api.pyc in post(url, data, **kwargs)
     86     """
     87
---> 88     return request('post', url, data=data, **kwargs)
     89
     90

/Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/api.pyc in request(method, url, **kwargs)
     42
     43     session = sessions.Session()
---> 44     return session.request(method=method, url=url, **kwargs)
     45
     46

/Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/sessions.pyc in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert)
    321             hooks = hooks,
    322         )
--> 323         prep = self.prepare_request(req)
    324
    325         proxies = proxies or {}

/Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/sessions.pyc in prepare_request(self, request)
    262             auth=merge_setting(auth, self.auth),
    263             cookies=merged_cookies,
--> 264             hooks=merge_setting(request.hooks, self.hooks),
    265         )
    266         return p

/Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/models.pyc in prepare(self, method, url, headers, files, data, params, auth, cookies, hooks)
    281         self.prepare_headers(headers)
    282         self.prepare_cookies(cookies)
--> 283         self.prepare_body(data, files)
    284         self.prepare_auth(auth, url)
    285         # Note that prepare_auth must be last to enable authentication schemes

/Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/models.pyc in prepare_body(self, data, files)
    411             # Multi-part file uploads.
    412             if files:
--> 413                 (body, content_type) = self._encode_files(files, data)
    414             else:
    415                 if data:

/Library/Python/2.7/site-packages/requests-2.0.0-py2.7.egg/requests/models.pyc in _encode_files(files, data)
    124                     fn, fp = v
    125                 else:
--> 126                     fn, fp, ft = v
    127             else:
    128                 fn = guess_filename(v) or k

ValueError: too many values to unpack
POST /test HTTP/1.1 Host: host User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 Accept: text/html Accept-Language: en-us Accept-Charset: utf-8 Keep-Alive: 300 Connection: keep-alive Content-Type: multipart/form-data; boundary=---------------------------3141592654 Content-Length: 111 -----------------------------3141592654 Content-Disposition: form-data; name="image"; filename="foo.png" Content-Type: image/png [img-data] -----------------------------3141592654 Content-Disposition: form-data; name="image"; filename="bar.png" Content-Type: image/png [img-data]