django文件上傳 和 使用模型來處理上傳的文件 限制文件擴展名


首先再html文件里寫

<form action="" method = 'post' enctype="multipart/form-data">
    <input type="file" name="myfile">    {# 網頁會出現選擇文件按鈕 #}
    <input type="submit" value="提交">
  1. 首先要先填入form標簽,在form標簽中指定  enctype=‘multipart/form-data’不然就不能上傳文件。
  2. 在form標簽中添加一個 input 標簽,然后指定input標簽的name,以及type='file'。

在視圖函數里寫:

from django.shortcuts import render
from django.views.generic import View
from django.http import HttpResponse
# Create your views here.
class IndexView(View):
    def get(self,request):
        return render(request,'index.html')
    def post(self,request):
        myfile = request.FILES.get('myfile')   #獲取文件
        with open('somefile.txt','wb') as wr:    #會生成somefile.txt 文件。
            for chunk in myfile.chunks():
                wr.write(chunk)
            return HttpResponse('success')

執行完畢后會生成一個somefile.txt文件,而且文件內容和所選文件的內容一樣。

 

使用模型來處理上傳的文件:

使用模型可以自動的將文件上傳到指定的地方。(要連接數據庫)

from django.db import models

# Create your models here.
class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    thumbnial = models.FileField(upload_to='files')   #必須新建一個files文件夾

模板定義完在視圖函數里直接取就好了:

    def post(self,request):
        title = request.POST.get('title')
        content = request.POST.get('content')
        file = request.FILES.get('myfile')     #獲取指定的文件
        Article.objects.create(title= title,content=content,thumbnial=file)
        return HttpResponse('success')

這時文件就已經上傳到file文件夾下。

 

指定MEDIA_ROOT和MEDIA_URL:

  • MEDIA_ROOT:以后會自動的將文件上傳到指定的文件夾中
  • MEDIA_URL:以后可以使用這個指定的路由來訪問上傳的媒體文件。
    MEDIA_ROOT = os.path.join(BASE_DIR,'media')    #以后會自動將文件上傳到指定的文件夾中
    MEDIA_URL = '/media/'   #以后可以使用這個路由來訪問上傳的媒體文件

    在settings.py中配置

  • 使用MEDIA_URL要在urls.py中配置路由
    from django.conf.urls.static import static
    from django.conf import settings
    urlpatterns = [
        path('', views.IndexView.as_view()),
    ]+static(settings.MEDIA_URL,document_roo = settings.MEDIA_ROOT)

    這樣就可以使用  http://127.0.0.1/media/aaa.txt路由來訪問上傳的文件

MEDIA_ROOT,upload  用法:

  在模板中定義上傳的文件時,可以用upload方法。這樣可以將文件在進行詳細的分類 ,  便於找到。

from django.db import models

# Create your models here.
class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    thumbnial = models.FileField(upload_to='files')
    # thumbnial = models.FileField(upload_to='%Y/%m/%d')

  1. media_root和upload同時定義的話,文件會定義到media_root當中但會在media_root指定文件夾下生成一個文件名為upload中定義的子文件。如下圖:  

  2. upload后面亦可以跟年月日  【upload_to='%Y/%m/%d'】會按照文件上傳的時間進行細分。如下圖:

 

 

限制文件擴展名:

  我們經常會在網頁上上傳文件,我們會發現如果人家需要的是圖片,如果你傳入文本格式,會有上傳失敗的錯誤。這就是我們的限制上傳的文件擴展名,來判斷上傳文件的格式是否正確。

如果要限制擴展名,就需要用到表單來限制。普通的Form或者ModelForm都是可以的。在模型中使用FileExtensionValidator

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    thumbnial = models.FileField(upload_to='%Y/%m/%d',validators=[validators.FileExtensionValidator(['txt'],message='thumnbnial必須時txt文件')])

forms.py

from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = '__all__'

 

上傳圖片:

上傳圖片和其他普通文本是一樣的,圖片用ImageField。 注意上傳圖片必須要先安裝pillow庫。

pip install pillow

 


免責聲明!

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



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