django 靜態文件之如何上傳文件

配置

有關上傳文件的靜態文件是用media來處理的
在settings.py裏面增加:

MEDIA_URL = '/upload/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')

對於這個配置什麼意思,可以參照我另一篇博文 :靜態文件的配置說明

使用django的FileField或ImageField字段

首先說明一下FileField的基本參數
FileField(upload_to = None, max_length = 100)
在upload_to設置上傳的文件的安放路徑,注意,這裏寫的是相對路徑,
比如upload_to = ‘user/’
那麼實際存儲的路徑爲 os.path.join(MEDIA_ROOT, ‘user’),
比如MEDIA_ROOT 爲 home/mysite/upload/
那麼存儲的路徑就是 home/mysite/upload/user/
另外,使用這個字段時,上傳的文件並沒有存入數據庫,存入數據庫的只是上傳的文件的路徑(當然, 強大的django可以讓我們輕鬆的獲得相對路徑和瀏覽器可以訪問的絕對路徑, 下面會講到)

1.在model裏面使用字段

比如有一個user的model, 需要一個字段來表示用戶頭像
在models.py中:

from django.db import models
class User(models.Model):
    user_name = models.CharField(max_length = 100)
    image = models.ImageField(uoload_to = 'user/', max_length = 100)

如果嫌upload_to要直接指定一個固定的路徑,不安全,那麼可以寫成動態路徑,如下

class User(models.Model):
    user_name = models.CharField(max_length = 100)
    image = models.ImageField(uoload_to = 'user/%Y/%m/%d/', max_length = 100)

django會將%Y/%m/%d/替換稱當前時間的年月日, 格式具體如下
比如, 我在2016.8.16上傳了一個文件,那麼,存儲的路徑就是:
MEDIA_ROOT/user/2016/08/16/

2.如何上傳文件呢,

我們以一個簡單的例子來說明
新建一個項目mysite以及應用user
首先,在user/templates/中建立
page.html

<form action = "#" enctype="multipart/form-data">
    <input type="file" name = "cover_image" />
</form>

在views.py中:

from user.models import User
from django.shortcuts import render

def index(request):
    if request.method == 'GET':
        return render(request, 'page.html')
    else :
        //上傳的文件保存在request.FILES中
        file = request.FILES.get('cover_image')
        user = User()
        user.user_name, user.image = 'boyce', file
        user.save()

在urls.py增加url與該視圖函數對應即可,再次不重複了

當調用該視圖函數時,就會將前端頁面上傳的文件存儲到upload_to設置的路徑中,

3.如何訪問上傳的路徑

FileField字段有幾個屬性
FileField.url 顯示上傳文件的絕對路徑
而FileField顯示的是相對路徑, 即使這upload_to設置的相對路徑
比如
user.image 爲 user/2016/8/13/photo.png
user.image.url 爲 /upload/user/2016/8/13/photo.png
在瀏覽器上,使用絕對路徑即可訪問相應的上傳文件(注意,這裏的絕對路徑, 不是本地的絕對路徑, 而是瀏覽器可訪問的絕對路徑, 前綴一定是MEDIA_URL設置的值)
所以 /upload/user/2016/8/13/photo.png 對應的本地路徑爲/home/mysite/upload/user/2016/8/13/photo.png, (MEDIA_ROOT/user/2016/8/13/photo.png)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章