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 相关文章推荐
Windows上使用virtualenv搭建Python+Flask开发环境
Jun 07 Python
Python连接PostgreSQL数据库的方法
Nov 28 Python
Python处理PDF及生成多层PDF实例代码
Apr 24 Python
详解Django之admin组件的使用和源码剖析
May 04 Python
Python 实现网页自动截图的示例讲解
May 17 Python
Django Admin实现三级联动的示例代码(省市区)
Jun 22 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
pytorch 求网络模型参数实例
Dec 30 Python
后端开发使用pycharm的技巧(推荐)
Mar 27 Python
Django实现celery定时任务过程解析
Apr 21 Python
Anaconda的安装及其环境变量的配置详解
Apr 22 Python
python 爬虫网页登陆的简单实现
Nov 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
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
php判断字符以及字符串的包含方法属性
2008/08/30 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
TNC vs RR BO3 第一场 2.14
2021/03/10 DOTA
一些技巧性实用js代码小结
2009/10/14 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
我的NodeJs学习小结(一)
2014/07/06 NodeJs
JavaScript中的对象序列化介绍
2014/12/30 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
Javascript的表单验证长度
2016/03/16 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
JavaScript 用fetch 实现异步下载文件功能
2017/07/21 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
2017/09/26 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
jQuery基于Ajax实现读取XML数据功能示例
2018/05/31 jQuery
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
详解 微信小程序开发框架(MINA)
2019/05/17 Javascript
微信小程序关键字变色实现代码实例
2019/12/13 Javascript
Vue 数据绑定的原理分析
2020/11/16 Javascript
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
用django设置session过期时间的方法解析
2019/08/05 Python
pytorch 自定义参数不更新方式
2020/01/06 Python
CSS3实现多背景展示效果通过CSS3定位多张背景
2014/08/10 HTML / CSS
CSS3实现苹果手机解锁的字体闪亮效果示例
2021/01/05 HTML / CSS
英国、欧洲和全球租车服务:Avis英国
2016/08/29 全球购物
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
师范学院教师自荐书
2014/01/31 职场文书
欢迎领导标语
2014/06/27 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
大学生第一学年自我鉴定2015
2014/09/28 职场文书
党风廉政教育心得体会2016
2016/01/22 职场文书
微软PC Health Check电脑健康状况检查应用下载(Win11配置检测工具)
2021/06/26 数码科技
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS