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 通过URL打开图片实例详解
Jun 01 Python
rabbitmq(中间消息代理)在python中的使用详解
Dec 14 Python
Python字符串拼接六种方法介绍
Dec 18 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 Python
Python基于生成器迭代实现的八皇后问题示例
May 23 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
Python eval的常见错误封装及利用原理详解
Mar 26 Python
用Python徒手撸一个股票回测框架搭建【推荐】
Aug 05 Python
python安装scipy的步骤解析
Sep 28 Python
Pycharm 安装 idea VIM插件的图文教程详解
Feb 21 Python
Python 中的Sympy详细使用
Aug 07 Python
基于Python实现股票收益率分析
Apr 02 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
老照片 - 几十年前的收音机与人
2021/03/02 无线电
php连接mysql数据库代码
2009/03/10 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
利用Laravel生成Gravatar头像地址的优雅方法
2017/12/30 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
php-7.3.6 编译安装过程
2020/02/11 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
js实现下拉框选择要显示图片的方法
2015/02/16 Javascript
Wireshark基本介绍和学习TCP三次握手
2016/08/15 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
javascript兼容性(实例讲解)
2017/08/15 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
python更改已存在excel文件的方法
2018/05/03 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
python使用 zip 同时迭代多个序列示例
2019/07/06 Python
python数值基础知识浅析
2019/11/19 Python
python异常处理和日志处理方式
2019/12/24 Python
详解torch.Tensor的4种乘法
2020/09/03 Python
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
铭立家具面试题
2012/12/06 面试题
社会实践感言
2014/01/25 职场文书
2014年大学生就业规划书
2014/04/04 职场文书
党政领导班子四风问题对照检查材料思想汇报
2014/10/02 职场文书
2014年档案管理工作总结
2014/11/17 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
Pyqt5将多个类组合在一个界面显示的完整示例
2021/09/04 Python
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
Go语言读取txt文档的操作方法
2022/01/22 Golang
MySQL慢查询优化解决问题
2022/03/17 MySQL
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers