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中合并两个文本文件并按照姓名首字母排序的例子
Apr 25 Python
Python入门及进阶笔记 Python 内置函数小结
Aug 09 Python
Python中正则表达式的详细教程
Apr 30 Python
解决python2.7用pip安装包时出现错误的问题
Jan 23 Python
详解Python中的动态属性和特性
Apr 07 Python
彻彻底底地理解Python中的编码问题
Oct 15 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
python实现两个文件夹的同步
Aug 29 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
Dec 12 Python
Python如何存储数据到json文件
Mar 09 Python
浅谈Python中的字符串
Jun 10 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 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
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
PHP Squid中可缓存的动态网页设计
2008/09/17 PHP
解析dedeCMS验证码的实现代码
2013/06/07 PHP
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
该如何加载google-analytics(或其他第三方)的JS
2010/05/13 Javascript
js 未结束的字符串常量错误解决方法
2010/06/13 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
javascript自定义函数参数传递为字符串格式
2014/07/29 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
微信小程序仿朋友圈发布动态功能
2018/07/15 Javascript
Angular使用cli生成自定义文件、组件的方法
2018/09/04 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
Python判断某个用户对某个文件的权限
2016/10/13 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
解决Windows下python和pip命令无法使用的问题
2020/08/31 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
2021/01/29 Python
Expedia印度尼西亚站:预订酒店、廉价航班和度假套餐
2018/01/31 全球购物
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
人事专员的岗位职责
2014/03/01 职场文书
法人授权委托书
2014/04/03 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
酒店前台岗位职责
2015/04/16 职场文书
简爱电影观后感
2015/06/10 职场文书
初中历史教学反思
2016/02/19 职场文书
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
2021/03/29 Python
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL
详解Python牛顿插值法
2021/05/11 Python
Nginx配置Https安全认证的实现
2021/05/26 Servers
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android