django文件上傳地址以及media的設置


一、關於media的設置

django的media文件地址的設置其實是類似於static文件地址的設置。

media主要是用來存放一些用戶上傳的文件(頭像、圖片等)

分為三個部分:

一是在proj中建立一個media文件夾,文件夾名字可任意取,為方便起見,此處就取名為media。

二是在setting中設置MEDIA_ROOT和MEDIA_URL

#用戶文件存放位置
MEDIA_ROOT= os.path.join(BASE_DIR,'media')
MEDIA_URL = '/media/'

MEDIA_URL是media文件夾的url地址,也就是在前端訪問時,使用  /media/ 這個url,到后端django會自動將該URL轉換為MEDIA_ROOT這個實際地址,但是需要進行第三步設置之后才能夠進行自動轉換。

三是在proj的url中進行設置:

from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
from zl_prac import settings

urlpatterns = [
                  path('admin/', admin.site.urls),
              ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

也就是在urlpatterns后進行轉換。

 

 二、關於文件上傳地址upto的設置

用django開發,經常要處理用戶上傳的文件, 比如user模型里面如果又個人頭像的字段 ImageField等等,而django在FielField字段(包括ImageField)的支持和擴展是做的很好的,首先一個問題,是上傳的文件怎樣才能放到我們想要放大的位置( 文件流是不會放到數據庫里面的,該字段在數據庫中只存儲路徑)。

一般情況下,用戶上傳的文件可以放在media/username下的細分文件夾,但是如何為不同的用戶指定不同的路徑呢?

django提供了upload_to屬性 
     以下介紹upload_to的具體使用方法。

注意:

如果setting中已經指定了media設置,那么,upload_to中的文件地址只要是相對地址,則都是存放在media文件夾下的。如果沒有設置,則存放在根目錄下。

下面的方法都是默認設置了media文件夾。

如果upload_to中的指定的文件夾不存在,則會自動創建。

1.直接指定固定地址:

在model中直接指定一個固定的地址

 

class User(models.Model):
    avatar = ImageField(upload_to = 'avatar/')

 

實際存放地址為  media/avatar/filename

2. 使用strftime函數

如果指定固定文件夾,則可能會存在多人上傳的不同文件重名情況,這時候需要解決文件名沖突。方法就是按照上傳的時間不同來存放。

為了避免重名,django在upload_to上內置了strftime()函數。將時間插入

# models.py
class User(models.Model):
    avatar = ImageField(upload_to = 'avatar/%Y/%m/%d/')

 

%Y、%m、%d分別表示年、月、日

存儲路徑為   media/avatar/年/月/日

3.利用函數生成地址

以上兩種方式都不能解決不同的用戶使用不同的文件夾的情況。可以使用自定義函數來解決這個問題:

#讓上傳的文件路徑動態地與user的名字有關
def upload_to(instance, fielname):  #返回一個路徑名即可。調用時會自動傳入user實例和filename兩個參數。函數名也不一定需要叫upload_to,只要傳入此函數即可。
    return '/'.join([MEDIA_ROOT, instance.user_name, filename])

class User(models.Model):
    avatar = ImageField(upload_to = upload_to)
    user_name = CharField(max_length = 250)

 

這里定義的upload_to返回的是一個絕對地址,改地址保存在數據庫中,但是不利於網絡的訪問,需要就行如下修改:

def up_to(instance, filename):
        return '/'.join([instance.uid, str(int(time.time())) + '_' + filename])

 

此函數返回的是一個相對地址,django會自動將該相對地址放在 media之下。

其真實存儲地址為   /media/返回地址

數據庫中則直接存放的是返回的地址。

這樣前端想訪問時,直接使用:

 <img id="img_thumbnail" src="/media/{{ user.avatar}}" alt="頭像">

 

注意,在前端使用的這個 /media/ ,並不是真正的meida文件夾,而是在setting中設置的MEDIA_URL。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM