teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

修正

2020/10/31 14:45

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -4,10 +4,9 @@
4
4
  ```
5
5
 
6
6
  という行がありますが、この例文のようにattributesオプションの構造をそのまま辞書化またはJSONフォーマット文字列にしてrequestsで指定しまうと、
7
- requestsのfilesパラメータの内容と競合して、
8
7
  うまくattributesの内容がBOX APIに渡らないようです。
9
8
 
10
- したがって、下記のように、parent_idだけ別途、requestsモジュールのdataパラメータに指定してPOSTしてやる必要があります。
9
+ したがって、下記のように、parent_idだけ別途、requestsモジュールのdataパラメータに指定してPOSTしてやるか、json.dumpsを使用して、ネストされたパラメータを文字列化して渡す必要があります。
11
10
 
12
11
  <全文>
13
12
  ```

2

追加

2020/10/31 14:45

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -25,6 +25,17 @@
25
25
  }
26
26
  file_bin = open(file_path, 'rb').read()
27
27
  data = { "parent_id": parent_id }
28
+ '''
29
+ または、下記のようにする。
30
+ data = {
31
+ "attributes" : json.dumps({
32
+ "name" : newfile_name,
33
+ "parent" : {
34
+ "id" : parent_id
35
+ }
36
+ })
37
+ }
38
+ '''
28
39
  # requestsでファイルアップロードするときの構成
29
40
  files = {"file" : (newfile_name, file_bin)}
30
41
 

1

修正

2020/10/31 14:19

投稿

sfdust
sfdust

スコア1137

answer CHANGED
@@ -1,22 +1,3 @@
1
- BOXのpython ライブラリ(https://github.com/box/box-python-sdk)を読み解いた結果
2
- 下記のようなことがわかりました。
3
-
4
- その前にまずrequestsの基本について。
5
-
6
- [requestsのドキュメント](https://requests.readthedocs.io/en/master/user/quickstart/#post-a-multipart-encoded-file/)に記載がありますが、
7
- requestsモジュールにおけるMultipart-encoded fileのPOSTには、一定の決まり事があります。
8
-
9
- すなわち、
10
- ```
11
- files = {'任意のキー': (<ファイル名>, <ファイルの内容>, <MIMEタイプ(省略可)>)}
12
- ```
13
- のように、キーとタプルから成る辞書を用意して、それをrequestsのpost関数のfilesパラメータに指定する必要があります。
14
-
15
- また、requestsのPOSTのときは、基本的にPOST内容によって自動的にContent-Typeを変えて送信してくれますので、あえてContent-Typeを指定する必要はありません。
16
-
17
-
18
- では、BOXの方に移ります。
19
-
20
1
  BOXのリファレンス上の[curlでのポスト例](https://developer.box.com/reference/post-files-content/#request-example)には
21
2
  ```
22
3
  -F attributes="{"name":"Contract.pdf", "parent":{"id":"11446498"}}"