使用json发送多部分上载

2024-10-01 15:30:26 发布

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

我尝试使用restapi和Python中的请求一起上传一个视频文件和一些JSON。在

下面是请求的cURL示例。在

curl -XPOST -i "https://io.cimediacloud.com/upload" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-F filename=@Movie.mov
-F metadata="{ 'metadata' : { 'Resolution' : '1080p', 'Language' : 'English' },        
'workspaceId' : 'a585b641a60843498543597d16ba0108', 'folderId' : 
'a585b641a60843498543597d16ba0108' }"

这是我的密码。在

^{pr2}$

当我运行这个程序时,API服务器返回MissingOrInvalidFileName错误。如果我省略了数据参数,文件就会正确上传。提出这个请求的正确方法是什么?在


Tags: httpsiocomrestapijson示例curl视频文件
2条回答

终于解决了!结果是请求用数据然后是文件对其多部分进行编码,而API需要的是文件,然后是数据。在

@Martijn Pieters将所有数据作为元组输入的解决方案几乎可以奏效。唯一的问题是这样设置数据会破坏请求自动设置content-type头的能力(它认为我的数据是content-type-application/json)。在

最后,我使用了request-toolbelt的multipartincoder,它允许我使用元组对多部分主体进行排序,并将内容类型保存在其实例中。这是最终的工作代码。在

m = MultipartEncoder([('filename', ('video.mp4', open('files/video.mp4', 'rb'))), 
                      ('metadata', json.dumps(metadata))])

r = session.post(url, data=m, headers={'Content-Type': m.content_type})

终于成功了。在

在curl请求中,您的file参数被称为filename,并且metadata部分应该是一个字符串(编码为JSON);它是一个字段,并且有一个嵌套的metadata对象。wordspaceIdfolderId是最外层metadata对象中的键,而不是单独的参数:

import json

files = {'filename': ('video.mp4', open('files/video.mp4', 'rb')),
metadata = {
    'metadata': {'Resolution': '1080p', 'Language': 'English'},
    'workspaceId': your_workspace_id,
    'folderId': folder_id
}
data = {'metadata': json.dumps(metadata)}
r = session.post(url, files=files, data=data)

相关问题 更多 >

    热门问题