如何在POST中表示文件?

时间:2014-07-03 15:49:52

标签: python facebook facebook-graph-api python-requests facebook-ads-api

我正在使用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

1 个答案:

答案 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 datarequests会将两者合并为一个multipart/form-data POST正文。

另见What does enctype='multipart/form-data' mean?application/x-www-form-urlencoded or multipart/form-data?