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实现k均值算法示例(k均值聚类算法)
Mar 16 Python
python 编程之twisted详解及简单实例
Jan 28 Python
Python 实现在文件中的每一行添加一个逗号
Apr 29 Python
django 实现电子支付功能的示例代码
Jul 25 Python
Flask之请求钩子的实现
Dec 23 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
Mar 14 Python
如何更优雅地写python代码
Jul 02 Python
利用rest framework搭建Django API过程解析
Aug 31 Python
解决tensorflow添加ptb库的问题
Feb 10 Python
Django之choices选项和富文本编辑器的使用详解
Apr 01 Python
Python利用matplotlib绘制散点图的新手教程
Nov 05 Python
Python编程根据字典列表相同键的值进行合并
Oct 05 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计算十二星座的函数代码
2012/08/21 PHP
PHP微信H5支付开发实例
2018/07/25 PHP
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
2012/10/12 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
vue.js 微信支付前端代码分享
2018/02/10 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
JavaScript 绘制饼图的示例
2021/02/19 Javascript
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
什么是CSS3 HSLA色彩模式?HSLA模拟渐变色条
2016/04/26 HTML / CSS
css和css3弹性盒模型实现元素宽度(高度)自适应
2019/05/15 HTML / CSS
全球才华横溢工匠的家居装饰、珠宝和礼物:NOVICA
2021/01/22 全球购物
平面设计师的工作职责
2013/11/21 职场文书
庆元旦活动总结
2014/07/09 职场文书
技术股份合作协议书
2014/10/05 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
2015年司法所工作总结
2015/04/27 职场文书
立项申请报告范本
2015/05/15 职场文书
行政复议答复书
2015/07/01 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书
python中 Flask Web 表单的使用方法
2022/05/20 Python
多线程Spring通过@Scheduled实现定时任务
2022/05/25 Java/Android
vue3不同环境下实现配置代理
2022/05/25 Vue.js