Django實(shí)現(xiàn)文件上傳下載功能
項(xiàng)目介紹
最近學(xué)習(xí)django,通過文件上傳下載這個(gè)小項(xiàng)目,總結(jié)下常用的知識(shí)點(diǎn)。
做這個(gè)案例我有以下需求:
1.要支持一次上傳多個(gè)文件
2.支持上傳后記錄上傳的數(shù)據(jù)以及列表展示
3.支持下載和刪除文件記錄
效果展示
數(shù)據(jù)庫(kù)記錄
開發(fā)步驟
創(chuàng)建項(xiàng)目:
django-admin startproject file_upload cd file_upload python manage.py startapp uploader
目錄結(jié)構(gòu):
0.settings.py
LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = False
1.urls.py
父:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('uploader/', include('uploader.urls')) ]
子:
from django.contrib import admin from django.urls import path, include from . import views app_name = 'uploader' urlpatterns = [ path('', views.upload, name='upload'), # 上傳 path('list/', views.list), # 列表 path('download/<id>', views.download, name='download'), # 下載 path('delete/<id>', views.delete, name='delete'), # 刪除 ]
2.models.py
from django.db import models from django.utils import timezone ''' 文件記錄 ''' class FileInfo(models.Model): file_name = models.CharField(max_length=500) file_size = models.DecimalField(max_digits=10, decimal_places=0) file_path = models.CharField(max_length=500) upload_time = models.DateTimeField(default=timezone.now())
3.forms.py
from django import forms ''' 上傳表單 ''' class UploadForm(forms.Form): file = forms.FileField( widget=forms.ClearableFileInput(attrs={'multiple': True}), # 支持多文件上傳 label='選擇文件...', help_text='最大100M' )
4.views.py
from django.shortcuts import render from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect from django.http import FileResponse from django.template import RequestContext from django.urls import reverse from django.utils.http import urlquote from .models import FileInfo from .forms import UploadForm import os # 上傳文件 def upload(request): # Handle file upload if request.method == 'POST': form = UploadForm(request.POST, request.FILES) if form.is_valid(): files = request.FILES.getlist('file') for f in files: file_info = FileInfo(file_name=f.name, file_size=1 if 0 < f.size < 1024 else f.size / 1024, file_path=os.path.join('D:\\upload', f.name)) file_info.save() # 上傳 destination = open(os.path.join("D:\\upload", f.name), 'wb+') for chunk in f.chunks(): destination.write(chunk) destination.close() # 返回上傳頁(yè) return HttpResponseRedirect('/uploader/list') else: form = UploadForm() # A empty, unbound form return render(request, 'uploader/upload.html', {'form': form}) # 文件列表 def list(request): file_infos = FileInfo.objects.all() return render(request, 'uploader/list.html', {'file_infos': file_infos}) # 下載文件 def download(request, id): file_info = FileInfo.objects.get(id=id) print('下載的文件名:' + file_info.file_name) file = open(file_info.file_path, 'rb') response = FileResponse(file) response['Content-Disposition'] = 'attachment;filename="%s"' % urlquote(file_info.file_name) return response # 刪除文件 def delete(request, id): file_info = FileInfo.objects.get(id=id) file_info.delete() file_infos = FileInfo.objects.all() return HttpResponseRedirect('/uploader/list')
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python實(shí)現(xiàn)將Excel文件轉(zhuǎn)換為JSON文件
在數(shù)據(jù)處理和分析中,Excel和JSON是兩種常見的數(shù)據(jù)格式,本文將詳細(xì)介紹如何使用Python將Excel文件轉(zhuǎn)換為JSON文件,我們將使用pandas庫(kù),這是一個(gè)強(qiáng)大的數(shù)據(jù)分析工具,能夠方便地讀取和處理各種數(shù)據(jù)格式,需要的朋友可以參考下2024-07-07python遞歸打印某個(gè)目錄的內(nèi)容(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇python遞歸打印某個(gè)目錄的內(nèi)容(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-08-08利用Numba與Cython結(jié)合提升python運(yùn)行效率詳解
近些年來(lái), Numba和Cython在數(shù)學(xué)科學(xué)界得到了廣泛的關(guān)注。它們都提供了一種加速CPU密集型任務(wù)的方法,但以不同的方式。本文描述了它們之間體系結(jié)構(gòu)的差異2021-09-09NumPy隨機(jī)數(shù)據(jù)分布與Seaborn可視化詳解
數(shù)據(jù)分布是指數(shù)據(jù)集中所有可能值出現(xiàn)的頻率,并用概率來(lái)表示,它描述了數(shù)據(jù)取值的可能性,Seaborn 是一個(gè)基于 Matplotlib 的 Python 數(shù)據(jù)可視化庫(kù),用于創(chuàng)建統(tǒng)計(jì)圖表,本文就給大家詳細(xì)的介紹一下NumPy隨機(jī)數(shù)據(jù)分布與Seaborn可視化,需要的朋友可以參考下2024-05-05Python實(shí)現(xiàn)一元一次與一元二次方程求解
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)一元一次與一元二次方程的求解,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06