通过请求发送multipart/formdata post的区别

2024-07-01 07:11:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试将文件发布到服务器时遇到问题。我正在尝试将文件上传到服务器,这个服务器对正确性非常敏感

我调试了将文件发送到服务器的页面,并通过浏览器发送此文件(TextView):

POST http://example.com/post HTTP/1.1
Host: example.com
Connection: keep-alive
Content-Length: 20625
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykGHBkXoER9gNuVna
Referer: http://example.com/foo
Accept-Encoding: gzip, deflate
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4,pt;q=0.2

------WebKitFormBoundarykGHBkXoER9gNuVna
Content-Disposition: form-data; name="files[]"; filename="file.zip"
Content-Type: application/octet-stream

...raw file data...

------WebKitFormBoundarykGHBkXoER9gNuVna--

但是,我的脚本正在发送这个(TextView):

^{pr2}$

对于服务器上的causes error,还需要注意:这个错误是在我将files=files更改为data=files时开始的

当前代码:

files = MultipartEncoder({'files[]': (filename, open(local_path,'rb'), mimetype)})
UploadFile = requests.post(self.UploadURL, data=files, allow_redirects=False)

工作代码:

files = {'files[]': (filename, open(local_path,'rb'), mimetype)}
UploadFile = requests.post(self.UploadURL, files=files, allow_redirects=False)

我使用MultipartEncoder来允许发送大文件。 我看到最大的不匹配是“边界”,但为什么这个“边界”是在working code中生成的,而在{}中却没有呢?在

怎么解决?在


Tags: 文件服务器comhttpdataapplicationexampletype
1条回答
网友
1楼 · 发布于 2024-07-01 07:11:45

您没有设置Content-Type头,MultipartEncoder为您提供了它:

files = MultipartEncoder({'files[]': (filename, open(local_path,'rb'), mimetype)})
UploadFile = requests.post(
    self.UploadURL, data=files, allow_redirects=False,
    headers={'Content-Type': files.content_type})

头必须来自多部分编码,因为它负责选择用于去除多部分响应中的各个MIME部分的边界。在你的上传中是:

^{pr2}$

但它是在每次代码运行时随机生成的。提供的标题如下所示:

Content-Type: multipart/form-data; boundary= f8c266cf436941019c5a80c7d4779a57

相关问题 更多 >

    热门问题