Discourse API のアップロード

こんにちは!

Python3 でファイルをアップロードする方法について質問があります。以下のように試してみたのですが、まだエラーが発生してしまいます。

> import requests
headers = {
    'content-type': 'multipart/form-data', #application/x-www-form-urlencoded ??
    'Api-Key': 'MyWorkingKey',
    'Api-Username': 'discourseAdmin',
}
URL = "https://discourse.com/uploads.json"
content = open('FULL_PATH_TO/avatar.jpg', 'rb').read()
data={"type": "avatar",'files[]': ('avatar.jpg', content, 'image/jpeg')}
requests.post(URL, headers=headers, data=data)

*ステータスコード: 422*
*レスポンステキスト: '{"failed":"FAILED","message":"undefined method `tempfile\' for \\"avatar.jpg\\":String"}'*

このファイルは、以下の curl コマンドでアップロードできました。

curl -X POST https://discourse.com/uploads.json \
-H "content-type: multipart/form-data;" \
-H "Api-Key: MyWorkingKey" \
-H "Api-Username: discourseAdmin" \
-F "type=avatar" \
-F "files[]=@FULL_PATH_TO/avatar.jpg"

残念ながら、この curl コマンドを Python にうまく変換できませんでした。

「いいね!」 1

私の環境では、以下のコードが機能しました:

r = requests.post(f'{rooturl}/uploads.json',
                  files = {'files[]': (file, open(file, 'rb'), 'image/png')},
                  data={'type':'image'},
                  headers={
                      "Api-Username" : sys.argv[1],
                      "Api-Key" : sys.argv[2],
                  })

おそらく、content-type': 'multipart/form-data' は省略すべきでしょう。そうすれば、requests ライブラリが適切な設定を自動で判断してくれます。

「いいね!」 4

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.