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执行子进程实现进程间通信的方法
Jun 02 Python
独特的python循环语句
Nov 20 Python
python 如何快速找出两个电子表中数据的差异
May 26 Python
Python学生成绩管理系统简洁版
Apr 05 Python
Python绘制正余弦函数图像的方法
Aug 28 Python
python查看模块安装位置的方法
Oct 16 Python
python创建学生成绩管理系统
Nov 22 Python
Python 支持向量机分类器的实现
Jan 15 Python
Python如何省略括号方法详解
Mar 21 Python
keras用auc做metrics以及早停实例
Jul 02 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
Sep 23 Python
PyTorch 中的傅里叶卷积实现示例
Dec 11 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
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
2017/01/17 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
Prototype Function对象 学习
2009/07/12 Javascript
js局部刷新页面时间具体实现
2013/07/04 Javascript
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
jQuery中prependTo()方法用法实例
2015/01/08 Javascript
jquery实现简单的无缝滚动
2015/04/15 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
AngularJS 防止页面闪烁的方法
2017/03/09 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
JavaScript数组排序reverse()和sort()方法详解
2017/12/24 Javascript
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
python实现图片转字符画的完整代码
2021/02/21 Python
Free People中国官网:波西米亚风格女装服饰
2016/08/30 全球购物
母亲节感恩活动记录
2014/03/16 职场文书
领导班子整改方案
2014/10/25 职场文书
先进集体申报材料
2014/12/25 职场文书
2015年感恩节演讲稿(优选篇)
2015/03/20 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书
聊聊Lombok中的@Builder注解使用教程
2021/11/17 Java/Android
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js
德劲DE1105机评
2022/04/05 无线电
python神经网络Xception模型
2022/05/06 Python