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求斐波那契数列示例分享
Feb 14 Python
Python Tkinter基础控件用法
Sep 03 Python
Python实现图像几何变换
Jul 06 Python
初步认识Python中的列表与位运算符
Oct 12 Python
python调用fortran模块
Apr 08 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
Mar 12 Python
在django中使用自定义标签实现分页功能
Jul 04 Python
python中matplotlib的颜色及线条控制的示例
Mar 16 Python
django允许外部访问的实例讲解
May 14 Python
python 获取一个值在某个区间的指定倍数的值方法
Nov 12 Python
python实现三维拟合的方法
Dec 29 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
Feb 21 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在服务器执行exec命令失败的解决方法
2012/03/03 PHP
浅析php过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
PHP实现网站应用微信登录功能详解
2019/04/11 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
JS加jquery简单实现标签元素的显示或隐藏
2013/09/23 Javascript
微信小程序(应用号)简单实例应用及实例详解
2016/09/26 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
JavaScript的级联函数用法简单示例【链式调用】
2019/03/26 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
解决vue cli使用typescript后打包巨慢的问题
2019/09/30 Javascript
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
nodeJS与MySQL实现分页数据以及倒序数据
2020/06/05 NodeJs
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
Python常见数据结构详解
2014/07/24 Python
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
Python之Web框架Django项目搭建全过程
2017/05/02 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
Python实现GUI学生信息管理系统
2020/04/05 Python
python 获取url中的参数列表实例
2018/12/18 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
HTML5 解决苹果手机不能自动播放音乐问题
2017/12/27 HTML / CSS
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
Python如何实现单例模式
2016/06/03 面试题
求职信的七个关键技巧
2014/02/05 职场文书
品牌宣传方案
2014/03/21 职场文书
毕业论文评语大全
2014/04/29 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
重阳节标语大全
2014/10/07 职场文书
销售员岗位职责范本
2015/04/11 职场文书