目標
解決原本圖片路徑只有純文字的情況:
後端
views
- 要得知是「哪一個產品」需要更新圖片,所以需傳入
product_id
用request.FILES.get('image')
取得上傳的圖片檔案 - 先不用規範
permission_classes
,這樣前端才不用在config
額外取token
1 |
|
urls
1 | path('upload/', views.uploadProductImage,name="product_image_upload"), |
前端
產品編輯前端頁面
- 上傳
Handler
函式必須得是async
,因為要等待上傳完成後再執行下一步 <Form.File
相關寫法已在react-bootstrap V5
版本以上被棄用,改用<Form.Control type='file' />
1 | // ProductEditPage.js |
逐步慢慢測試,先查看上傳檔案後,主控台是否有印出檔案名稱
確定有擷取到檔案後,用 e.target.files[0];
取得檔案陣列中的第一個檔案,並宣告一個 FormData
物件,將檔案名稱、產品 ID 一併帶入 FormData
物件傳給後端
1 | // ProductEditPage.js |
- 使用
FormData
作為請求體時,Axios
會自動檢測並設置適當的Content-Type
,不需要自己寫config
設定,若後端有額外規定permission_classes
就需要在config
設定token
/api/products/upload/
的路徑一定要跟後端urls.py
設定的一模一樣,原本在upload
這少加了/
,一直報405 Error
完成後,應就能看到產品成功更換圖片,去專案的 static
資料夾下,也能看到上傳的新圖片檔
更改上傳圖片目的地
假設原本上傳圖片的位置是存放到 niceshop/backend/static/images
資料夾下,但經過考量想改將存放用戶上傳圖片的位置改成 niceshop/backend/media/
- STATIC_ROOT(和 STATICFILES_DIRS)主要存放「前端靜態資源」(JS、CSS、圖片)。
- MEDIA_ROOT 主要存放「用戶上傳的檔案」,如:產品圖片、頭像、附件等。
此時需要更改的地方有:
1 | # settings.py |
另外產品圖片預設上傳路徑若是如下:
1 | # models.py |
此時用戶上傳產品圖就會存到 niceshop/backend/media/products/
資料夾下,能有效區分前端靜態資源與用戶上傳檔案
若您覺得這篇文章對您有幫助,歡迎分享出去讓更多人看到⊂◉‿◉つ~
留言版