回答編集履歴

1

ドキュメントはよく読む

2020/12/30 11:37

投稿

A_kirisaki
A_kirisaki

スコア2853

test CHANGED
@@ -1 +1,45 @@
1
1
  `axios.post` の第 3 引数に `{headers: {'Content-Type': 'multipart/form-data' }}` を渡してあげてみてください。
2
+
3
+
4
+
5
+ ### 追記
6
+
7
+ #### ドキュメントをよく読もう!
8
+
9
+ わたしがです!
10
+
11
+
12
+
13
+ [Uploading Files — Flask Documentation (1.1.x)](https://flask.palletsprojects.com/en/1.1.x/patterns/fileuploads/)
14
+
15
+ 解決法:
16
+
17
+ ```Python
18
+
19
+ ...
20
+
21
+ def upload_image():
22
+
23
+ if 'file' in request.files: # <--- ここ!!!
24
+
25
+ return make_response(jsonify({'result':'file is empty.'}))
26
+
27
+ file = request.files['image']
28
+
29
+ ...
30
+
31
+ ```
32
+
33
+ #### なぜ `'file' in request.files['image']` ではダメなのか
34
+
35
+ 標準入出力を始めファイル、ネットワークなどは最後まで読み切ってからデータを処理するのでは遅いので読み込みながら処理をします。これを**ストリーミング処理**といい、そのデータが湧いてくる部分自体をストリームと言います。ストリーミング処理はデータを全部残しておくとメモリを圧迫するので、必要な分を返したら捨ててしまいます。
36
+
37
+
38
+
39
+ それで Flask もデータを効率よく処理するために **Werkzeugの** ストリーム処理を行うクラスを使っています。そしてここにある `Request` というクラスがその処理を担っているんですが、アクセスできるデータは全部ストリームなんです。`request.files['image']` を呼んだ瞬間ストリーミング処理がバッと走って、その結果を代入しないと次 `request.files['image']` を見に行っても中身が空、というわけなんですね。
40
+
41
+
42
+
43
+ という挙動がちゃんとドキュメントに書いてありました!ごめんドキュメント!!
44
+
45
+ [Dealing with Request Data — Werkzeug Documentation (1.0.x)](https://werkzeug.palletsprojects.com/en/1.0.x/request_data/)