「アップロード:作成」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」スコープを持つ詳細設定のキーを使用すると、/uploads/generate-presigned-put への post で403エラーが発生します。

「いいね!」 2

よく気がつきました。この件は解決します。プロトコルがS3への直接アップロードに対応するため、以前より複雑になっている点にご留意ください。

「いいね!」 2

APIの利用を始めたばかりなので、これが通常の複雑さだと認識しています。:slight_smile:

以下が十分でない状況はありますか?

  1. ファイル情報を /uploads/generate-presigned-putPOST する
    • 結果として、アップロード先のリモートURL(認証パラメータを含む)と一意のアップロードIDが含まれる
  2. 上記のURLに画像データを PUT する
    • これが失敗した場合のエラーを処理する
  3. 上記のアップロードIDを /uploads/complete-external-uploadPOST する
    • 結果として、APIの他の場所(バッジ作成など)で使用できる画像IDが得られる

@mattdm様、ダイレクトアップロードフローのこれらの新しいアクションをカバーするようにAPIキーのスコープを更新し、サイトもデプロイしました。引き続き問題がある場合はお知らせください。

確認しました!これで動作します。ありがとうございます!

「いいね!」 3

このトピックは20時間後に自動的に閉じられました。新しい返信はもう許可されていません。