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之编写类之二方法
Oct 11 Python
Python使用CMD模块更优雅的运行脚本
May 11 Python
python监控文件或目录变化
Jun 07 Python
利用Python开发微信支付的注意事项
Aug 19 Python
Python中functools模块函数解析
Mar 12 Python
python解决字符串倒序输出的问题
Jun 25 Python
python 定义n个变量方法 (变量声明自动化)
Nov 10 Python
python使用threading.Condition交替打印两个字符
May 07 Python
django之自定义软删除Model的方法
Aug 14 Python
python3常用的数据清洗方法(小结)
Oct 31 Python
python与mysql数据库交互的实现
Jan 06 Python
详解如何修改python中字典的键和值
Sep 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
《被神捡到的男人》动画化计划进行中!
2020/03/06 日漫
VOLVO车载收音机
2021/03/02 无线电
php中的登陆login
2007/01/18 PHP
Look And Say 序列php实现代码
2011/05/22 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
PHP调用接口API封装的例子
2019/10/11 PHP
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
jquery实现手风琴效果实例代码
2013/11/15 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
JavaScript中获取HTML元素值的三种方法
2016/06/20 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
d3.js实现自定义多y轴折线图的示例代码
2018/05/30 Javascript
使用Node.js实现一个多人游戏服务器引擎
2019/03/13 Javascript
nodejs中的异步编程知识点详解
2021/01/17 NodeJs
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
Python常用的爬虫技巧总结
2016/03/28 Python
Python MD5加密实例详解
2017/08/02 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
python爬取亚马逊书籍信息代码分享
2017/12/09 Python
Python内置函数reversed()用法分析
2018/03/20 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
Python实现异步IO的示例
2020/11/05 Python
德国家具在线:Fashion For Home
2017/03/11 全球购物
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
面临毕业的毕业生自荐书范文
2014/02/05 职场文书
办公室岗位职责
2014/02/12 职场文书
临时租车协议范本
2014/09/23 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
护理实习生带教计划
2015/01/16 职场文书
英语专业毕业论文答辩开场白
2015/05/27 职场文书
golang DNS服务器的简单实现操作
2021/04/30 Golang
Oracle11g R2 安装教程完整版
2021/06/04 Oracle