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实现面向对像的ASP程序实例
Nov 10 Python
python实现简单的计时器功能函数
Mar 14 Python
在Python的Django框架中更新数据库数据的方法
Jul 17 Python
python实现文本去重且不打乱原本顺序
Jan 26 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
多个应用共存的Django配置方法
May 30 Python
pandas.dataframe按行索引表达式选取方法
Oct 30 Python
Python按钮的响应事件详解
Mar 04 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
Aug 05 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
Python自动化操作实现图例绘制
Jul 09 Python
python属于哪种语言
Aug 16 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
关于PHP5 Session生命周期介绍
2010/03/02 PHP
基于PHP编程注意事项的小结
2013/04/27 PHP
php中的静态变量的基本用法
2014/03/20 PHP
PHP的APC模块实现上传进度条
2015/10/27 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
JS实现页面打印(整体、局部)
2017/08/18 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
小程序视频列表中视频的播放与停止的示例代码
2018/07/20 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
jQuery实现鼠标拖动图片功能
2021/03/04 jQuery
Python中的变量和作用域详解
2016/07/13 Python
Python通过命令开启http.server服务器的方法
2017/11/04 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
python中cPickle类使用方法详解
2018/08/27 Python
pandas 根据列的值选取所有行的示例
2018/11/07 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
python3判断IP地址的方法
2021/03/04 Python
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
《自选商场》教学反思
2014/02/14 职场文书
会计专业求职信范文
2014/03/16 职场文书
2014年法院工作总结
2014/11/24 职场文书
人民的好儿女观后感
2015/06/18 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python
Python学习之包与模块详解
2022/03/19 Python
MySQL视图概念以及相关应用
2022/04/19 MySQL