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 import引入不同路径下的模块
Jul 11 Python
使用Python实现简单的服务器功能
Aug 25 Python
Python验证文件是否可读写代码分享
Dec 11 Python
微信跳一跳python辅助软件思路及图像识别源码解析
Jan 04 Python
Python爬虫爬取一个网页上的图片地址实例代码
Jan 16 Python
详解python实现线程安全的单例模式
Mar 05 Python
python和opencv实现抠图
Jul 18 Python
Python字典遍历操作实例小结
Mar 05 Python
python登录WeChat 实现自动回复实例详解
May 28 Python
在PyCharm中实现添加快捷模块
Feb 12 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
Sep 01 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
Feb 22 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
PHP中file_exists函数不支持中文名的解决方法
2014/07/26 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
jquery 元素相对定位代码
2010/10/15 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
2015/08/07 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
2016/07/08 Javascript
jQuery回调方法使用示例
2017/06/26 jQuery
对vue中v-on绑定自定事件的实例讲解
2018/09/06 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
基于进程内通讯的python聊天室实现方法
2015/06/28 Python
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
Python简单生成随机姓名的方法示例
2017/12/27 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
python使用minimax算法实现五子棋
2019/07/29 Python
Python如何实现动态数组
2019/11/02 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
基于python tkinter的点名小程序功能的实例代码
2020/08/22 Python
详解CSS3原生支持div铺满浏览器的方法
2018/08/30 HTML / CSS
台湾最大网路书店:博客来
2018/03/18 全球购物
研修心得体会
2014/09/04 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
语文教师求职信范文
2015/03/20 职场文书
儿子满月酒致辞
2015/07/29 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
Python进度条的使用
2021/05/17 Python
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android