使用 Python 请求将附件上传到 Confluence REST API 会出现 415 和 500 错误
Uploading attachments to Confluence REST API with Python Requests gives 415 and 500 Errors
我正在尝试使用 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()
缺少的是正确的content-typeheader。那里有不同的信息:
- 为文件使用正确的 content-type,在本例中为
image/jpeg
- 使用
application/octet-stream
- 使用
application/json
- 使用
multipart/form-data
(我使用的Confluence版本是5.8.10)
使用正确的 content-type 并不是这里唯一的问题。在正确的地方使用它同样重要。对于文件上传,content-type 必须 与文件 一起提供,而不是作为请求本身的 header。
即使 Python Requests documentation 明确写明 files
参数用于上传 multipart-encoded 文件,content-type 也需要明确设置为正确的类型附件。
虽然它并不完全正确(请参阅下面的评论),但 multipart/form-data
也可以正常工作,因此如果我们确实无法确定正确的 content-type:
,我们可以将其用作后备方案
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()
我正在尝试使用 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()
缺少的是正确的content-typeheader。那里有不同的信息:
- 为文件使用正确的 content-type,在本例中为
image/jpeg
- 使用
application/octet-stream
- 使用
application/json
- 使用
multipart/form-data
(我使用的Confluence版本是5.8.10)
使用正确的 content-type 并不是这里唯一的问题。在正确的地方使用它同样重要。对于文件上传,content-type 必须 与文件 一起提供,而不是作为请求本身的 header。
即使 Python Requests documentation 明确写明 files
参数用于上传 multipart-encoded 文件,content-type 也需要明确设置为正确的类型附件。
虽然它并不完全正确(请参阅下面的评论),但 multipart/form-data
也可以正常工作,因此如果我们确实无法确定正确的 content-type:
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()