如何上传文件作为数组元素与海报?

2024-03-28 16:39:06 发布

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

我试图重复以下curl请求:

curl -i -k -H "Content-Type: multipart/form-data" \
  -F "method=uploadphoto" \
  -F "version=1.2.3" \
  -F "format=json" \
  -F "image[0]=@/Users/user/Downloads/file.jpeg" \
  https://example.com/api

使用poster时:

^{pr2}$

但看起来image字段是作为单个字段传递的,这时应该传递数组。使用image[0]作为名称没有帮助。在

我怎样才能修好它?在


Tags: imageformjsonformatdataversiondownloadstype
1条回答
网友
1楼 · 发布于 2024-03-28 16:39:06

我将示例切换为使用请求,因为我没有安装googleappsdk,但下面的代码可以工作。在

一个重要的改变是将image改为{},这样远程端就可以识别出多个同名的输入。不确定是否同样适用于urlphetch,但我必须在原始post主体之后添加一个额外的\r\n。在

为了说明和测试,我让它上传了第二张图片。在

首先,守则:

from poster.encode import multipart_encode, MultipartParam
import requests
from pprint import pprint

file_content = open('/home/me/Pictures/admin.jpg', 'rb').read()
file_content2 = open('/home/me/Pictures/ed.jpeg', 'rb').read()
url = 'http://localhost/test.php'
parms = {
    'method': 'uploadphoto',
    'version': '1.2.3',
    'format': 'json'
}
mp_parms = []
for name, value in parms.items():
    mp_parms.append(MultipartParam(name, value, filetype='text/plain'))

file_photo = MultipartParam('image[]', file_content, 'file.jpeg', 'image/jpg')
mp_parms.append(file_photo)

file_photo = MultipartParam('image[]', file_content2, 'test.jpeg', 'image/jpg')
mp_parms.append(file_photo)

parameters, headers = multipart_encode(mp_parms)

pprint(headers)

#response = urlfetch.Fetch(url, payload=''.join(parameters), headers=headers, method=urlfetch.POST, deadline=60)

r = requests.post(url, data=''.join(parameters) + "\r\n", headers=headers)

print r.text

它发布到的test.php脚本包含<?php var_dump($_POST, $_FILES, $_SERVER);,并显示如下输出:

^{pr2}$

它在Wireshark上发布了以下帖子:

POST /test.php HTTP/1.1
Host: localhost
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.12.1
Content-Length: 102186
Content-Type: multipart/form-data; boundary=176473ffab3146b5bfffc6185ad9474a

 176473ffab3146b5bfffc6185ad9474a
Content-Disposition: form-data; name="version"
Content-Type: text/plain

1.2.3
 176473ffab3146b5bfffc6185ad9474a
Content-Disposition: form-data; name="method"
Content-Type: text/plain

uploadphoto
 176473ffab3146b5bfffc6185ad9474a
Content-Disposition: form-data; name="format"
Content-Type: text/plain

json
 176473ffab3146b5bfffc6185ad9474a
Content-Disposition: form-data; name="image[]"; filename="file.jpeg"
Content-Type: image/jpg

......JFIF.....H.H.....C...................................
...snip...
..K5{......1....fh........k..n...
 176473ffab3146b5bfffc6185ad9474a
Content-Disposition: form-data; name="image[]"; filename="test.jpeg"
Content-Type: image/jpg

......JFIF.............;CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 90
...snip...
6.......~.h.j......}29..b~.h.).2.!E..tU.........L....d...lv..+....f)Y...
 176473ffab3146b5bfffc6185ad9474a 

HTTP/1.1 200 OK

我希望这有帮助。我不确定API是否会在意,但您可能希望base64对图像数据进行编码,并将内容编码设置为base64,以使原始二进制文件不在post中。在

如果你在整合了一些变化后仍然被卡住了,请告诉我!在

相关问题 更多 >