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 相关文章推荐
Java中重定向输出流实现用文件记录程序日志
Jun 12 Python
在Django框架中编写Context处理器的方法
Jul 20 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
May 03 Python
Python:Scrapy框架中Item Pipeline组件使用详解
Dec 27 Python
Sublime开发python程序的示例代码
Jan 24 Python
python list转矩阵的实例讲解
Aug 04 Python
对python中的高效迭代器函数详解
Oct 18 Python
解决python flask中config配置管理的问题
Jul 26 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
Sep 24 Python
tensorflow 实现自定义layer并添加到计算图中
Feb 04 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 Python
解决Django响应JsonResponse返回json格式数据报错问题
Aug 09 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
$_GET['goods_id']+0 的使用详解
2013/06/06 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
PHP无限极分类函数的实现方法详解
2017/04/15 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
简单的Jquery全选功能
2013/11/07 Javascript
Node.js中的模块机制学习笔记
2014/11/04 Javascript
JavaScript数组常用操作技巧汇总
2014/11/17 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
2015/12/18 Javascript
JavaScript中使用数组方法汇总
2016/02/16 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
JavaScript暂停和继续定时器的实现方法
2016/07/18 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
[46:40]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
从零学Python之入门(三)序列
2014/05/25 Python
深入理解Python中的元类(metaclass)
2015/02/14 Python
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
Django添加feeds功能的示例
2018/08/07 Python
python实现的生成word文档功能示例
2019/08/23 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
美津浓美国官网:Mizuno美国
2018/08/07 全球购物
SQL Server面试题
2016/10/17 面试题
J2EE中的容器都包括哪些
2013/08/21 面试题
工作保证书范文
2014/04/29 职场文书
乌镇导游词
2015/02/02 职场文书
社区文明创建工作总结2015
2015/04/21 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书
教你一步步实现一个简易promise
2021/11/02 Javascript