Django 如何实现文件上传下载


Posted in Python onApril 08, 2021

1. 前言

大家好,我是安果!

文件上传、下载作为基础功能,在 Web 项目中非常普遍,Django 项目如何实现文件上传下载?

本篇文章将带大家 5 分钟快速实现文件上传下载功能

2. 实战一下

详细实现步骤如下( 9 步)

2-1  进入虚拟环境,创建一个项目及 App

workon django3

# 创建项目
django-admin startproject file_up_and_down_demo

# 进入项目根目录
cd file_up_and_down_demo/

# 创建一个App
django-admin startapp index

2-2  创建模板目录并配置 settings.py

在 index App 下创建一个 templates 文件夹,然后在项目配置文件 settings.py 中配置 App 及模板目录

# settings.py

# 配置App
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'index',
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            # 配置模板目录
            os.path.join(BASE_DIR, 'index/templates')
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

2-3  创建文件模型,并映射到数据库

以默认的 sqlite 为例,在 index App 下的 models.py 中自定义一个代表文件的模型

该模型包含 3 个字段:

  • 文件名称
  • 文件保存路径
  • 上传时间
# index App models.py

from django.db import models
from django.utils import timezone


# 文件模型
class FileModel(models.Model):
    # 文件名称
    name = models.CharField(max_length=50)

    # 文件保存路径
    path = models.CharField(max_length=100)

    # 上传时间
    upload_time = models.DateTimeField(default=timezone.now)

然后,在项目根目录下执行下面 2 条命令,将模型结构映射到数据库中

# 数据库映射
Python3 manage.py makemigrations

python3 manage.py migrate

2-4  自定义表单控件

在 index App 下创建一个表单文件 forms.py

在内部自定义一个表单类,继承于 forms.Form

# index App forms.py

from django import forms

class FileForm(forms.Form):
    file = forms.FileField(
        # 支持多文件上传
        widget=forms.ClearableFileInput(attrs={'multiple': True}),
        label='请选择文件',
    )

2-5  添加上传、下载路由 URL

为上传、下载功能添加路由 URL

# 项目urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('index.urls'))
]

# index App urls.py
from django.urls import path

from .views import *

urlpatterns = [
    # 上传
    path('', index_view, name='index'),

    # 下载
    path('download/<id>', download_view, name='download')
]

2-6  编写模板文件

在 index App 的模板文件夹创建一个简单的模板文件 upload.html

其中

  • form 代表视图函数传过来的表单实体对象
  • form.as_p 代表以字段格式渲染所有的表单元素
# index App upload.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主页-上传文件</title>
</head>
<body>

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="确定上传">
</form>

</body>
</html>

2-7  上传视图函数

在 index App 下的 views.py 中编写上传功能的视图函数

需要注意的是,我们需要提前在项目根目录创建一个 upload 文件夹,用于存放上传的文件

# index App views.py

def index_view(request):
    """
    上传文件
    :param request:
    :return:
    """
    if request.method == 'POST':
        form = FileForm(request.POST, request.FILES)
        if form.is_valid():
            # 选择的文件
            files = request.FILES.getlist('file')

            # 遍历写入到数据库中
            for file in files:
                # 写入到数据库中
                file_model = FileModel(name=file.name, path=os.path.join('./upload', file.name))
                file_model.save()

                # 写入到服务器本地
                destination = open(os.path.join("./upload", file.name), 'wb+')
                for chunk in file.chunks():
                    destination.write(chunk)
                destination.close()

            # 提示上传成功
            return HttpResponse('上传成功!')
    else:
        form = FileForm()
        return render(request, 'upload.html', locals())

2-8  下载视图函数

接着,编写下载功能的视图函数

# index App views.py

def download_view(request, id):
    """
    下载文件
    :param request:
    :param id:文件id
    :return:
    """
    file_result = FileModel.objects.filter(id=id)

    # 如果文件存在,就下载文件
    if file_result:

        file = list(file_result)[0]

        # 文件名称及路径
        name = file.name
        path = file.path

        # 读取文件
        file = open(path, 'rb')
        response = FileResponse(file)

        # 使用urlquote对文件名称进行编码
        response['Content-Disposition'] = 'attachment;filename="%s"' % urlquote(name)

        return response
    else:
        return HttpResponse('文件不存在!')

2-9  运行并测试

运行项目,访问下面的地址,并上传一个文件

使用 Pycharm 打开 sqlite 数据库,发现成功插入一条文件记录,并且文件也上传到 upload 文件夹下

接着访问下面的地址实现文件下载功能「 其中,file_id 代表文件的 id 值 」

http://127.0.0.1:8000/download/file_id

3. 最后

文章通过一个简单的例子实现了文件的上传、下载功能,并同步文件记录到数据库

实际项目中,一般还包含文件列表、文件删除等功能,这些功能只需要结合数据库来增删查改即可实

代码地址:https://github.com/xingag/python_web

以上就是Django 如何实现文件上传下载的详细内容,更多关于Django实现文件上传下载的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python的Tornado框架实现图片上传及图片大小修改功能
Jun 30 Python
在Python中通过threading模块定义和调用线程的方法
Jul 12 Python
python实现用户答题功能
Jan 17 Python
Python机器学习logistic回归代码解析
Jan 17 Python
Python实现最常见加密方式详解
Jul 13 Python
python库skimage给灰度图像染色的方法示例
Apr 27 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
Jul 07 Python
Python selenium键盘鼠标事件实现过程详解
Jul 28 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
Sep 21 Python
基于Python组装jmx并调用JMeter实现压力测试
Nov 03 Python
如何通过Python实现RabbitMQ延迟队列
Nov 28 Python
python3 删除所有自定义变量的操作
Apr 08 #Python
pytorch显存一直变大的解决方案
Apr 08 #Python
Python文件的操作示例的详细讲解
Django展示可视化图表的多种方式
python tkinter模块的简单使用
python如何在word中存储本地图片
python 下载文件的几种方式分享
Apr 07 #Python
You might like
咖啡的种类和口感
2021/03/03 新手入门
php 文件状态缓存带来的问题
2008/12/14 PHP
整理的9个实用的PHP库简介和下载
2010/11/09 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
再谈Javascript中的异步以及如何异步
2016/08/19 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
使用Vue-cli 3.0搭建Vue项目的方法
2018/06/07 Javascript
JavaScript 性能提升之路(推荐)
2019/04/10 Javascript
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
Python selenium如何设置等待时间
2016/09/15 Python
Python性能提升之延迟初始化
2016/12/04 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
基于python socketserver框架全面解析
2017/09/21 Python
python3 图片referer防盗链的实现方法
2018/03/12 Python
python实现验证码识别功能
2018/06/07 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
2020/03/16 Python
Django中的AutoField字段使用
2020/05/18 Python
Python logging模块原理解析及应用
2020/08/13 Python
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
英语专业学生个人求职信范文
2014/01/06 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
主题实践活动总结
2014/05/08 职场文书
服务整改报告
2014/11/06 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
CSS 鼠标选中文字后改变背景色的实现代码
2023/05/21 HTML / CSS