gpt4 book ai didi

Python - HTTP 多部分/表单数据 POST 请求

转载 作者:太空狗 更新时间:2023-10-30 01:16:09 25 4
gpt4 key购买 nike

我想上传文件到网络服务器。据我所知,最好的方法是在 HTTP POST 请求中使用 multipart/form-data 编码类型。

我的研究似乎表明,使用 Python 标准库没有简单的方法可以做到这一点。我正在使用 Python 3。

(注意:查看一个名为 requests 的包(PyPI Link)可以轻松完成此操作)

我目前使用的是这种方法:

import mimetypes, http.client
boundary = 'wL36Yn8afVp8Ag7AmP8qZ0SA4n1v9T' # Randomly generated
for fileName in fileList:
# Add boundary and header
dataList.append('--' + boundary)
dataList.append('Content-Disposition: form-data; name={0}; filename={0}'.format(fileName))

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

with open(fileName) as f:
# Bad for large files
dataList.append(f.read())

dataList.append('--'+boundary+'--')
dataList.append('')
contentType = 'multipart/form-data; boundary={}'.format(boundary)

body = '\r\n'.join(dataList)
headers = {'Content-type': contentType}

conn = http.client.HTTPConnection('http://...')
req = conn.request('POST', '/test/', body, headers)

print(conn.getresponse().read())

这适用于发送文本。

有两个问题:这只是文本,整个文本文件必须作为一个巨大的字符串存储在内存中。

如何上传任何二进制文件?有没有办法在不将整个文件读入内存的情况下执行此操作?

最佳答案

看看小Doug Hellmann's urllib2 ,由我翻译成 python3。

我几乎是这样使用它的:

import urllib.request
import urllib.parse
from lib.multipart_sender import MultiPartForm

myfile = open('path/to/file', 'rb')
form = MultiPartForm()
form.add_field('token', apipost[mycgi['domain']]._token)
form.add_field('domain', mycgi['domain'])
form.add_file('file', 'logo.jpg', fileHandle=myfile)
form.make_result()

url = 'http://myurl'
req1 = urllib.request.Request(url)
req1.add_header('Content-type', form.get_content_type())
req1.add_header('Content-length', len(form.form_data))
req1.add_data(form.form_data)
fp = urllib.request.urlopen(req1)
print(fp.read()) # to view status

关于Python - HTTP 多部分/表单数据 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15767785/

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