“上传:创建”API密钥不足?

我正在使用以下代码通过 API 上传:

# 并询问 Discourse 将其发送到何处。
r = requests.post(
    f"https://{DISCOURSE}/uploads/generate-presigned-put", json=file_info, headers=HEADERS)
if r.status_code != 200:
    print(
        f"询问图片上传位置时出错:收到 {r.status_code}", file=sys.stderr)
    sys.exit(1)

upload_url = r.json()['url']
upload_uid = r.json()['unique_identifier']

# 现在将其放入我们被告知的地方。
r = requests.put(upload_url, data=image_data)
if r.status_code != 200:
    print(
        f"上传图片到外部存储时出错:收到 {r.status_code}", file=sys.stderr)
    sys.exit(1)

# 并告诉 Discourse 已成功,并获得一个稍后可以引用的 ID。
r = requests.post(f"https://{DISCOURSE}/uploads/complete-external-upload",
                  data=f'unique_identifier={upload_uid}', headers=HEADERS)
if r.status_code != 200:
    print(f"完成上传时出错:收到 {r.status_code}", file=sys.stderr)
    sys.exit(1)
image_id = r.json()['id']

这在使用“完全访问”API 密钥时有效,但当我尝试使用具有“uploads: create”范围的精细密钥时,在 post/uploads/generate-presigned-put 时收到 403 错误。

2 个赞

干得好,我们会解决这个问题。请注意,由于我们现在直接上传到 S3,协议会更复杂一些。

2 个赞

我是在您切换后才开始使用此 API 的,据我所知,这就是正常的复杂程度。:slight_smile:

是否存在以下情况不足以满足需求?

  1. 将文件信息 POST/uploads/generate-presigned-put
    • 结果包含一个用于上传的远程 URL(包含身份验证参数)和一个唯一的上传 ID
  2. 将图像数据 PUT 到上述 URL
    • 处理此操作失败时的错误
  3. 将上述上传 ID POST/uploads/complete-external-upload
    • 结果是一个可以在 API 其他地方使用的图像 ID(例如创建徽章)

您好 @mattdm 我已更新 API 密钥范围以涵盖我们直接上传流程中的这些新操作,并且我还部署了您的网站,如果您仍有问题,请告知我。

确认!现在可以了。谢谢!

3 个赞

此主题已在 20 小时后自动关闭。不再允许回复。