gpt4 book ai didi

python - 如何将内容处置 header 设置为文件部分的附件?

转载 作者:太空宇宙 更新时间:2023-11-03 20:28:55 24 4
gpt4 key购买 nike

我正在使用 Python requests 模块发送包含表单数据和文件附件的多部分 HTTP POST 请求。

每个多部分对象的“Content-disposition” header 设置为“form-data”,包括文件部分。

我需要表单数据部分的“Content-disposition” header 仍然显示“form-data”,但文件部分的“Content-disposition” header 必须显示“attachment”而不是“form-data” ”。

如何仅更改文件部分的内容处置 header ?

我的代码:

#Python 3.7.3 (default, Apr 24 2019, 13:20:13) [MSC v.1915 32 bit (Intel)]
import requests

#USER PARAMETERS
user_name = 'user_account'
password = 'user_password'
token = '45Hf4xGhj'

#REQUESTS PARAMETERS
url = '192.168.0.2'
headers = {'content-type': 'multi-part/form-data'}
data = {'Username':user_name, 'Password':password, 'Token':token}
files = {'settings': ('settings.xml', open('settings.xml', 'rb'), 'app/xml')}

#POST
response = requests.post(url, headers=headers, data=data, files=files)

这就是 Python 请求中文件部分的 header 的样子:

Content-Type: app/xml
Content-Disposition: form-data; name="settings"; filename="settings.xml"

这就是我需要的文件部分的标题:

Content-Type: app/xml
Content-Disposition: attachment; name="settings"; filename="settings.xml"

我还尝试通过向文件添加 header 参数来更改 header :

files = {'settings': ('settings.xml', open('settings.xml', 'rb'),
'app/xml', {'Content-Disposition':'attachment'})}

但这没有效果。我可以指定任何其他自定义 header ,它会添加它,但如果我使用该方法,它不会更改“Content-Disposition” header 。

有什么想法吗?

<小时/>

使用工具带:

m = MultipartEncoder( fields={'Username': user_name, 
'Password': password,
'Token': token,
'settings': ('settings', open('settings.xml', 'rb'),
'app/xml',
{'Content-Disposition':'attachment'}
)
}
)

r = requests.post('http://httpbin.org/post',
data=m,
headers={'Content-Type': m.content_type})

results in

...--2ba9624051854b6d961bad262a1792fc 
Content-Disposition: form-data; name="settings"; filename="settings"
Content-Type: app/xml
<?xml version="1.0" encoding="utf-16"?>...

最佳答案

Question: Set Content-disposition header as attachment for file part?

简短的回答:使用python-requests,这是不可能的,按照现在的实现方式。

Explanation:

requests/models.py

class RequestEncodingMixin(object):
...
def _encode_files(files, data):
...
rf = RequestField(name=k, data=fdata, filename=fn, headers=fh)
rf.make_multipart(content_type=ft)

Variable fh holdes the 4th tuple item passed from

files = {'settings': (filename, io.BytesIO(b'some,data,to,send\nanother,row,to,send\n'),
'app/xml', {'Content-Disposition':'attachment'} )}

The rf.header dict get updated passing headers=fh with 'Content-Disposition':....
Calling rf.make_multipart(content_type=ft), at the next line, only passing the 3trd tuple item.

The method make_multipart - urllib3/fields.py is defined as

def make_multipart(
self, content_disposition=None, content_type=None, content_location=None
):
self.headers["Content-Disposition"] = content_disposition or u"form-data"
...

which replaces self.headers["Content-Disposition"] with the default u"form-data".

<小时/>

Possible Solutions:

  1. 仅使用 urllib3 就可以做到这一点

    rf.make_multipart(content_disposition=fh.get("Content-Disposition"), content_type=ft)
  2. urllib3 和/或 python-requests 提交请求以解决此问题。

  3. 自行修补,requests/models.pyurlib3/fields

<小时/>

Patch: def make_multipart

如果 self.headers 中尚未添加默认的 Content-Disposition: form-data,则仅添加默认的 Content-Disposition: form-data

from urllib3 import fields

def make_multipart(
self, content_disposition=None, content_type=None, content_location=None
):
if self.headers.get("Content-Disposition") is None:
self.headers["Content-Disposition"] = content_disposition or u"form-data"

self.headers["Content-Disposition"] += u"; ".join(
[
u"",
self._render_parts(
((u"name", self._name), (u"filename", self._filename))
),
]
)
self.headers["Content-Type"] = content_type
self.headers["Content-Location"] = content_location

fields.RequestField.make_multipart = make_multipart

Resulting multipart:

--e96a4935b8d5b2355f1da3070faa4b28
Content-Disposition: attachment; name="settings"; filename="settings.xml"
Content-Type: app/xml

some,data,to,send
another,row,to,send

--e96a4935b8d5b2355f1da3070faa4b28--

使用 Python 测试:3.5 - urllib3:1.23 - 请求:2.19.1

关于python - 如何将内容处置 header 设置为文件部分的附件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57644481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com