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

回答編集履歴

1

コメントへの補足

2020/10/20 15:28

投稿

attakei
attakei

スコア2740

answer CHANGED
@@ -1,3 +1,5 @@
1
+ ## 回答
2
+
1
3
  ```python
2
4
  upload_url = fileobject.url(filedata)
3
5
  ```
@@ -31,4 +33,33 @@
31
33
  "uploaded_url": upload_url,
32
34
  "uploaded_df": upload_df,
33
35
  })
34
- ```
36
+ ```
37
+
38
+ ## 質問のコードでは何故ダメか(コメントへの補足)
39
+
40
+ 「(現時点で)存在する変数は何を扱っているか」「どこでプログラムを実行しているか」を意識する必要があります。
41
+
42
+ ### 前提:view関数の、主要な変数について
43
+
44
+ ※以下は、自分が前回含め回答を書いてた際に認識しているものです
45
+
46
+ - `fileobject`: [FileSystemStorage](https://docs.djangoproject.com/en/3.1/ref/files/storage/#the-filesystemstorage-class)のインスタンス。ファイルの管理が役割
47
+ - `filedata`: `fileobject.save()`で保存した際のファイル名(ファイル名のみ)
48
+ - `upload_url`: `fileobject`によって組み立てられた、アップロード済みファイルのURL(HTML用)
49
+
50
+ ### upload_url ではダメな理由
51
+
52
+ `upload_url`はあくまでURL用のため、ローカルでのファイルアクセス用に使うのは不適切です。
53
+
54
+ ### "../media/" + filedata ではダメな理由
55
+
56
+ アプローチとして「ローカルファイルへのアクセス」という観点では間違っていないのですが、
57
+ 相対パスはプログラム実行時のカレントディレクトリから解決されていくため、
58
+ 「カレントディレクトリ」がどこかを把握できていないと、正しく組み立てられることが出来ません。
59
+
60
+ 偶然噛み合うことがありますが、正しい情報を元にパスを組み立てる必要があります。
61
+ (おそらくですが、`"./media/"+filedata`だと正しく機能してしまっている可能性があります)
62
+
63
+ ※今回のケースでは、アップロード以降のローカルでの処理を`fileobject`に委ねているので、
64
+  「実際のファイルパス」も`fileobject`に委ねるのが理想です。
65
+  (実際に`path()`というオブジェクトを持っています)