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 相关文章推荐
Django卸载之后重新安装的方法
Mar 15 Python
python 读入多行数据的实例
Apr 19 Python
基于python批量处理dat文件及科学计算方法详解
May 08 Python
Python实现的特征提取操作示例
Dec 03 Python
关于python中plt.hist参数的使用详解
Nov 28 Python
Tensorflow Summary用法学习笔记
Jan 10 Python
python将音频进行变速的操作方法
Apr 08 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
May 11 Python
python实现批处理文件
Jul 28 Python
python实现图片转字符画
Feb 19 Python
python异常中else的实例用法
Jun 15 Python
Python数组变形的几种实现方法
May 30 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如何读取由JavaScript设置的Cookie
2017/03/22 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
详解php与ethereum客户端交互
2018/04/28 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
javascript倒计时效果实现
2015/11/12 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
[13:16]INFAMOUS vs VGJ T BO3
2018/06/07 DOTA
python实现调用其他python脚本的方法
2014/10/05 Python
Python编程之Re模块下的函数介绍
2017/10/28 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
Python自定义一个异常类的方法
2019/06/27 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
Python中if有多个条件处理方法
2020/02/26 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
Python如何绘制日历图和热力图
2020/08/07 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
Free People中国官网:波西米亚风格女装服饰
2016/08/30 全球购物
DC Shoes俄罗斯官网:美国滑板鞋和服饰品牌
2020/08/19 全球购物
医校毕业生自我鉴定
2014/01/25 职场文书
学校卫生检查制度
2014/02/03 职场文书
文明风采获奖感言
2014/02/18 职场文书
社区党务公开实施方案
2014/03/18 职场文书
厨房领班竞聘演讲稿
2014/04/23 职场文书
2014年项目经理工作总结
2014/11/24 职场文书
党员带头倡议书
2015/04/29 职场文书