use*_*138 5 python multipartform-data urllib2 python-requests
我想知道你如何使用Python请求翻译这样的东西?在urllib2中,您可以手动操作通过线路发送到API服务的数据,但是请求声明多部分文件上传很容易.但是,当尝试使用请求库发送相同的请求时,我认为它没有正确地为内容类型中的每个部分指定一些关键参数.有人可以就这件事情说清楚.先感谢您!
def upload_creative(self, account_id, file_path):
""""""
boundary = '-----------------------------' + str(int(random.random()*1e10))
parts = []
# Set account ID part.
parts.append('--' + boundary)
parts.append('Content-Disposition: form-data; name="account_id"')
parts.append('')
parts.append(str(account_id))
# Set creative contents part.
parts.append('--' + boundary)
parts.append('Content-Disposition: form-data; name="userfile"; filename="%s"' % file_path)
parts.append('Content-Type: %s' % mimetypes.guess_type(file_path)[0] or 'application/octet-stream')
parts.append('')
# TODO: catch errors with opening file.
parts.append(open(file_path, 'r').read())
parts.append('--' + boundary + '--')
parts.append('')
body = '\r\n'.join(parts)
headers = {'content-type': 'multipart/form-data; boundary=' + boundary}
url = self._resolve_url('/a/creative/uploadcreative')
req = urllib2.Request(url, headers=headers, data=body)
res = urllib2.urlopen(req)
return json.loads(res.read())
Run Code Online (Sandbox Code Playgroud)
当我从UI查看firebug时,我在POST源代码中获得以下内容.
-----------------------------662549079759661058833120391
Content-Disposition: form-data; name="userfile"; filename="IMG_1377.jpg" Content-Type: image/jpeg
ÿØÿáÃExif??MM?*???? ???????ª???? ???°?????????????????????º???????Â(???????1???????Ê2???????Ú<???????î???????i???????þ%??????p??Apple?iPhone 4???H??????H?????QuickTime 7.7.1?2012:08:17 11:47:11?Mac OS X 10.7.4?????????????? "???????'?????P???????0220??????(??????<?????? ?????P??????X??????? ????? ?? ??????`??????h ?????0100 ??????? ?????? ??????¢???????¤????????¤????????¤????????¤ ??????????????????????2011:10:01 17:19:23?2011:10:01 17:19:23???4??Á??¹??¡???M???Ç»¸??????N??????????Ê?????W??????????â???????ú?????M?????????????????!?????S???d??????????T?????ÿ???d?????????????????????Ú????%Á??r??????????????t??????|(???????????????????7????????????H??????H?????ÿØÿà?JFIF??H?H??ÿþ?AppleMark ÿÛ?? % #!,!#'(***.1-)1%)*( (((((((((((((((((((((((((((((((((((((((((((((((((((ÿÄ¢?????????? ??????? ???}?!1AQa"q2¡#B±ÁRÑð$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùú??w?!1AQaq"2B¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz¢£¤¥¦§¨©ª²³´µ¶·¸¹ð.¥ÛWíÇLòV³FcaoæÂÒ8§É¸(è3E¢"Ú×S^+yj?!òû0Oüµn- yè){[oÝ/¸?ÃÔMY¡ÃgÔò4êò4n͸í¶={ÔM¤¸m¯K&ñæ«,©ù»zTÝ=öØô×6¶Ö:MÑi?,Û$Oö[ª÷ª©ÆiîỤJAxj>ÞAõúu¥}lIf÷û^Â)#´y^)Ô"/·v>n~4ººµ¬æ}FURì·Î 3¿Ãèh»ÐµÈÿ?·|Gu:ß²<ëlWäG·^+¡Ó¼gâ.-Þè|ϸ*ª® }é?Ú=(i:2½Ïg!ʵÑi¤¼eþ!÷³ÍC'æCqv®ÖÊÕiçCë·øsQy#K_B´þ0s'¦|¿Þ²lò¼?½ÿ?]rZ¶¨ø·6ñÆØ·mvV;þÿ?þ=ôª¿»r\zPñtHö÷>Ù¤R#+ Á òBôR;ú²¾)!àËn<.ÁÔlÏcRäÂ&§eX´fTóLžQßt§Zµ{â t·pK]ÈL1²îýúEüxþ÷j\î×-jÏÂ>!û:^,E,>^ýêßwû+Ópæ»?i÷û5kéá¹^ 6Ddq°öÁ¯Rù¨¦yãjòÿÙ
-----------------------------662549079759661058833120391
Content-Disposition: form-data; name="account_id"
69574
-----------------------------662549079759661058833120391--
Run Code Online (Sandbox Code Playgroud)
萤火虫的标题如下:
Request Headersview source
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Cache-Control no-cache
Connection keep-alive
Content-Length 1713991
Content-Type multipart/form-data; boundary=---------------------------662549079759661058833120391
Cookie instance_defaults=%7C%20%7Cen_US; access_token=75c48e
Host ui.host.com
Pragma no-cache
Referer http://ui.host.com/
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:14.0) Gecko/20100101 Firefox/14.0.1
Run Code Online (Sandbox Code Playgroud)
我想我的问题是有没有办法通过请求库来调整数据,以便:
Content-Disposition: form-data; name="userfile"; filename="IMG_1377.jpg" Content-Type: image/jpeg
Run Code Online (Sandbox Code Playgroud)
和
Content-Disposition: form-data; name="account_id"
69574
Run Code Online (Sandbox Code Playgroud)
陈述都存在.我觉得我必须做一些像文件一样的字典
files = {'file': open('image.jpg', 'rb'), 'account_id': 12345}
Run Code Online (Sandbox Code Playgroud)
但不知何故分别编辑每个部分的Content-Disposition元数据
有requests,我相信你不必这么手动,简单地说:
import requests
# ...
url = self._resolve_url('/a/creative/uploadcreative')
files = {'file': ('userfile', open(filepath, 'rb'))}
data = {'account_id': account_id}
headers = {'content-type': 'multipart/form-data'}
res = requests.post(url, files=files, data=data, headers=headers)
return res.json
Run Code Online (Sandbox Code Playgroud)
我想你的关注点在于你:
parts.append('Content-Type: %s' % mimetypes.guess_type(file_path)[0] or 'application/octet-stream')
Run Code Online (Sandbox Code Playgroud)
我没有在怀疑的阴影下证明这一点.但是,我认为这是建立在对请求这里.
编辑:看起来你可以在文件dict中有正常的字段,如你所建议:
files = {'file': open('image.jpg', 'rb'), 'account_id': 12345}
Run Code Online (Sandbox Code Playgroud)
并可以根据需要命名文件名:
files = {'file': ('userfile', open('image.jpg', 'rb')), 'account_id': 12345}
Run Code Online (Sandbox Code Playgroud)
但是,你会得到一个可能不是你想要body.write(b'Content-Type: text/plain\r\n\r\n')的account_id字段,并且没有办法为每个字段定制Content-Disposition(仍然不确定为什么你需要); 对于文件和字段,您将获得:Content-Disposition: form-data- 这是您为两者显示的内容.
我不确定你能做到你想要的requests,也许你应该尝试功能请求.
| 归档时间: |
|
| 查看次数: |
18313 次 |
| 最近记录: |