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 相关文章推荐
go语言计算两个时间的时间差方法
Mar 13 Python
python脚本内运行linux命令的方法
Jul 02 Python
python3.5仿微软计算器程序
Mar 30 Python
Python判断某个用户对某个文件的权限
Oct 13 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
Oct 09 Python
Python列表与元组的异同详解
Jul 02 Python
Python facenet进行人脸识别测试过程解析
Aug 16 Python
python3连接MySQL8.0的两种方式
Feb 17 Python
结束运行python的方法
Jun 16 Python
简单谈谈Python面向对象的相关知识
Jun 28 Python
Python 数据可视化之Matplotlib详解
Nov 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
PHP之生成GIF动画的实现方法
2013/06/07 PHP
PHP set_error_handler()函数使用详解(示例)
2013/11/12 PHP
php中实现精确设置session过期时间的方法
2014/07/17 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
CI框架无限级分类+递归的实现代码
2016/11/01 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
JavaScript 学习点滴记录
2009/04/24 Javascript
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
Javascript 圆角div的实现代码
2009/10/15 Javascript
validator验证控件使用代码
2010/11/23 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
如何书写高质量jQuery代码(使用jquery性能问题)
2014/06/30 Javascript
ECMAScript6函数默认参数
2015/06/12 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
信息滚动效果的实例讲解
2017/09/18 Javascript
JavaScript伪数组用法实例分析
2017/12/22 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解
2019/08/26 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
解决layui下拉框监听问题(监听不到值的变化)
2019/09/28 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
2020/04/25 Javascript
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
Python实现翻转数组功能示例
2018/01/12 Python
在python环境下运用kafka对数据进行实时传输的方法
2018/12/27 Python
python文字转语音实现过程解析
2019/11/12 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
Michael Kors美国官网:美式奢侈生活风格的代表
2016/11/25 全球购物
国贸专业自荐信范文
2014/03/02 职场文书
创业计划书之酒厂
2019/10/14 职场文书
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python
Linux中各个目录的作用与内容
2022/06/28 Servers