我正在使用Python请求并尝试将图像上传到Facebook Ads API服务器。
我可以使用data
requests.post(endpoint, data={'pic.jpg': open('pic.jpg', 'rb')})
然后当我打印请求的主体时,它看起来像pic.jpg=%FF%D8%FF%E0%00%10JFIF...
,其中包含那些%_的东西(我猜这些是字节?)
我也可以使用files
requests.post(endpoint, files={'pic.jpg': open('pic.jpg', 'rb')})
然后当我打印请求的正文时,它看起来像
--7bfdd12d05f549f3953f32165da5900c
Content-Disposition: form-data; name="pic.jpg"; filename="pic.jpg"
????JFIFHH??C
!1AQ"q2??????#BRW?$3b????7Cr????...
还有更多?' s和奇怪的符号。
如果要进行文件上传,哪个是正确的?对于最顶层的我从Facebook API返回[]
,对于第二个我回来null
。
答案 0 :(得分:3)
当您使用files
时,POST数据被编码为multipart/form-data
,这是您发布包含大量二进制内容blob的表单数据时所需的内容。
如果另一方面使用 data
,则使用application/x-www-form-urlencoded
代替(除非您只传入一个字符串,然后按原样发布数据)
对于文件上传,您可能需要前者,因为multipart/form-data
也可以编码文件数据的mime类型和文件名。查看Facebook Ad API adimage enpoint他们的示例使用curl -F
,记录下来使用multipart/form-data
进行上传。
请记住还需要在POST中包含access_token
:
requests.post(endpoint,
files={'pic.jpg': open('pic.jpg', 'rb')},
data={'access_token': '___'})
这同时使用files
和 data
,requests
会将两者合并为一个multipart/form-data
POST正文。
另见What does enctype='multipart/form-data' mean?和application/x-www-form-urlencoded or multipart/form-data?