Django实现文件上传下载功能


Posted in Python onOctober 06, 2019

项目介绍

最近学习django,通过文件上传下载这个小项目,总结下常用的知识点。
做这个案例我有以下需求:

1.要支持一次上传多个文件

2.支持上传后记录上传的数据以及列表展示

3.支持下载和删除文件记录

效果展示

Django实现文件上传下载功能

数据库记录

Django实现文件上传下载功能

开发步骤

创建项目:

django-admin startproject file_upload
cd file_upload
python manage.py startapp uploader

目录结构:

Django实现文件上传下载功能

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()
 
  # 返回上传页
  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')

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用异常处理来判断运行的操作系统平台方法
Jan 22 Python
python列表操作之extend和append的区别实例分析
Jul 28 Python
python3操作mysql数据库的方法
Jun 23 Python
pandas 对每一列数据进行标准化的方法
Jun 09 Python
python实现俄罗斯方块
Jun 26 Python
Python中的Numpy矩阵操作
Aug 12 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
Python中logging.NullHandler 的使用教程
Nov 29 Python
Python Numpy计算各类距离的方法
Jul 05 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
Feb 28 Python
python进行二次方程式计算的实例讲解
Dec 06 Python
使用turtle绘制五角星、分形树
Oct 06 #Python
wxPython:python首选的GUI库实例分享
Oct 05 #Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 #Python
python是否适合网页编程详解
Oct 04 #Python
为什么说Python可以实现所有的算法
Oct 04 #Python
python的命名规则知识点总结
Oct 04 #Python
Python中断多重循环的思路总结
Oct 04 #Python
You might like
php 生成饼图 三维饼图
2009/09/28 PHP
php实现删除空目录的方法
2015/03/16 PHP
zend framework中使用memcache的方法
2016/03/04 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
基于PHP制作验证码
2016/10/12 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
初始Nodejs
2014/11/08 NodeJs
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
jQuery无刷新切换主题皮肤实例讲解
2015/10/21 Javascript
表单验证正则表达式实例代码详解
2015/11/09 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
js 自带的sort() 方法全面了解
2016/08/16 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
vue.js,ajax渲染页面的实例
2018/02/11 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
Flutter 超实用简单菜单弹出框 PopupMenuButton功能
2019/08/06 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
python开发之for循环操作实例详解
2015/11/12 Python
PyCharm代码格式调整方法
2018/05/23 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
2019/04/25 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
python实现简易淘宝购物
2019/11/22 Python
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
英文简历自荐信范文
2013/12/11 职场文书
铁路个人事迹材料
2014/01/30 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
四查四看自我剖析材料
2014/09/19 职场文书
学校师德师风整改措施
2014/10/27 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书