使用Python请求将附件上载到Confluence REST API会产生415和500错误

时间:2016-02-09 07:28:57

标签: python rest python-requests confluence-rest-api

我正在尝试使用Python请求通过REST API将附件上传到Confluence。我总是得到一个" 415不支持的媒体类型"错误或" 500内部服务器错误",具体取决于我发送请求的方式。

有几个关于如何使用其他语言执行此操作的信息,或者通过现已弃用的XMLRPC API使用Python,或者看起来行为略有不同的JIRA REST API。

根据所有信息,这就是代码应如下所示:

def upload_image():
    url = 'https://example.com/confluence/rest/api/content/' + \
          str(PAGE_ID) + '/child/attachment/'
    headers = {'X-Atlassian-Token': 'no-check'}
    files = {'file': open('image.jpg', 'rb')}
    auth = ('USR', 'PWD')
    r = requests.post(url, headers=headers, files=files, auth=auth)
    r.raise_for_status()

缺少的是正确的内容类型标头。有不同的信息:

  • 为文件使用正确的内容类型,在本例中为image/jpeg
  • 使用application/octet-stream
  • 使用application/json
  • 使用multipart/form-data

(我使用的Confluence版本是5.8.10)

1 个答案:

答案 0 :(得分:2)

使用正确的内容类型不是唯一的问题。在正确的地方使用它同样重要。对于文件上传,内容类型必须随文件提供,而不是作为请求本身的标头。

即使Python Requests documentation显式写入files参数用于上传多部分编码文件,也需要将内容类型显式设置为附件的正确类型。
虽然它不完全正确(请参阅下面的评论),但multipart/form-data也可以正常工作,因此如果我们无法确定正确的内容类型,我们可以将其用作后备:

def upload_image():
    url = 'https://example.com/confluence/rest/api/content/' + \
          str(PAGE_ID) + '/child/attachment/'
    headers = {'X-Atlassian-Token': 'no-check'} #no content-type here!
    file = 'image.jpg'

    # determine content-type
    content_type, encoding = mimetypes.guess_type(file)
    if content_type is None:
        content_type = 'multipart/form-data'

    # provide content-type explicitly
    files = {'file': (file, open(file, 'rb'), content_type)}

    auth = ('USR', 'PWD')
    r = requests.post(url, headers=headers, files=files, auth=auth)
    r.raise_for_status()