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编程中namedtuple类的用法
Jun 21 Python
python通过socket实现多个连接并实现ssh功能详解
Nov 08 Python
Python之Scrapy爬虫框架安装及使用详解
Nov 16 Python
Python调用服务接口的实例
Jan 03 Python
使用Python+wxpy 找出微信里把你删除的好友实例
Feb 21 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
django ManyToManyField多对多关系的实例详解
Aug 09 Python
Python中list循环遍历删除数据的正确方法
Sep 02 Python
利用pandas合并多个excel的方法示例
Oct 10 Python
pycharm安装及如何导入numpy
Apr 03 Python
python基于pexpect库自动获取日志信息
Feb 01 Python
python geopandas读取、创建shapefile文件的方法
Jun 29 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
discuz Passport 通行证 整合笔记
2008/06/30 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
javascript中简单的进制转换代码实例
2013/10/26 Javascript
jquery左右全屏大尺寸多图滑动效果代码分享
2015/08/28 Javascript
javascript每日必学之封装
2016/02/23 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
JavaScript常见鼠标事件与用法分析
2019/01/03 Javascript
手把手教你使用TypeScript开发Node.js应用
2019/05/06 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
js面向对象方式实现拖拽效果
2021/03/03 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
[14:56]教你分分钟做大人:巫医
2014/10/30 DOTA
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
Python获取邮件地址的方法
2015/07/10 Python
python微信跳一跳系列之棋子定位颜色识别
2018/02/26 Python
python 堆和优先队列的使用详解
2019/03/05 Python
Python实现发票自动校核微信机器人的方法
2020/05/22 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
2021/01/07 Python
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
自我评价优秀范文分享
2013/11/30 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
运动会报道稿大全
2015/07/23 职场文书
2016高考冲刺决心书
2015/09/23 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS