表單-文件上傳

 

文件上傳:

文件上傳是網站開發中很是常見的功能。這裏詳細講述如何在Django中實現文件的上傳功能。javascript

前端HTML代碼實現:

1.在前端中,咱們須要填入一個form標籤,而後在這個form標籤中指定enctype="multipart/form-data",否則就不能上傳文件。
2.在form標籤中添加一個input標籤,而後指定input標籤的name,以及type="file"
以上兩步的示例代碼以下:html

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="myfile">
</form>

後端的代碼實現:

後端的主要工做是接收文件。而後存儲文件。接收文件的方式跟接收POST的方式是同樣的,只不過是經過FILES來實現。示例代碼以下:前端

def save_file(file):
    with open('somefile.txt','wb') as fp:
        for chunk in file.chunks():
            fp.write(chunk)

def index(request):
    if request.method == 'GET':
        form = MyForm()
        return render(request,'index.html',{'form':form})
    else:
        myfile = request.FILES.get('myfile')
        save_file(myfile)
        return HttpResponse('success')


以上代碼經過request.FILES接收到文件後,再寫入到指定的地方。這樣就能夠完成一個文件的上傳功能了。java

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

在定義模型的時候,咱們能夠給存儲文件的字段指定爲FileField,這個Field能夠傳遞一個upload_to參數,用來指定上傳上來的文件保存到哪裏。好比咱們讓他保存到項目的files文件夾下,那麼示例代碼以下:python

# models.py
class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    thumbnail = models.FileField(upload_to="files")


# views.py
def index(request):
    if request.method == 'GET':
        return render(request,'index.html')
    else:
        title = request.POST.get('title')
        content = request.POST.get('content')
        thumbnail = request.FILES.get('thumbnail')
        article = Article(title=title, content=content, thumbnail=thumbnail)
        article.save()
        return HttpResponse('success')


調用完article.save()方法,就會把文件保存到files下面,而且會將這個文件的路徑存儲到數據庫中。ios

指定MEDIA_ROOT和MEDIA_URL:

以上咱們是使用了upload_to來指定上傳的文件的目錄。咱們也能夠指定MEDIA_ROOT,就不須要在FielField中指定upload_to,他會自動的將文件上傳到MEDIA_ROOT的目錄下。web

settings.py
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
MEDIA_URL = '/media/'


而後咱們能夠在urls.py中添加MEDIA_ROOT目錄下的訪問路徑。示例代碼以下:數據庫

from django.urls import path
from front import views
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    path('', views.index),
] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)


若是咱們同時指定MEDIA_ROOTupload_to,那麼會將文件上傳到MEDIA_ROOT下的upload_to文件夾中。示例代碼以下:django

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    thumbnail = models.FileField(upload_to="%Y/%m/%d/")

限制上傳的文件拓展名:

若是想要限制上傳的文件的拓展名,那麼咱們就須要用到表單來進行限制。咱們可使用普通的Form表單,也可使用ModelForm,直接從模型中讀取字段。示例代碼以下:後端

# models.py
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','pdf'])])

# forms.py
class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = "__all__"

上傳圖片:

上傳圖片跟上傳普通文件是同樣的。只不過是上傳圖片的時候Django會判斷上傳的文件是不是圖片的格式(除了判斷後綴名,還會判斷是不是可用的圖片)。若是不是,那麼就會驗證失敗。咱們首先先來定義一個包含ImageField的模型。示例代碼以下:

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    thumbnail = models.ImageField(upload_to="%Y/%m/%d/")


由於要驗證是不是合格的圖片,所以咱們還須要用一個表單來進行驗證。表單咱們直接就使用ModelForm就能夠了。示例代碼以下:

class MyForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = "__all__"


注意:使用ImageField,必需要先安裝Pillow庫:pip install pillow

相關文章
相關標籤/搜索