千家信息网

Django如何实现文件上传下载

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,小编给大家分享一下Django如何实现文件上传下载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 前言文件上传、下载作
千家信息网最后更新 2025年11月07日Django如何实现文件上传下载

小编给大家分享一下Django如何实现文件上传下载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

1. 前言

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

2. 实战一下

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

workon django3# 创建项目django-admin startproject file_up_and_down_demo# 进入项目根目录cd file_up_and_down_demo/# 创建一个Appdjango-admin startapp index

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

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

# settings.py# 配置AppINSTALLED_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.pyfrom django.db import modelsfrom 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 makemigrationspython3 manage.py migrate

2-4 自定义表单控件

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

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

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

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

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

# 项目urls.pyfrom django.contrib import adminfrom django.urls import path, includeurlpatterns = [    path('admin/', admin.site.urls),    path('', include('index.urls'))]# index App urls.pyfrom django.urls import pathfrom .views import *urlpatterns = [    # 上传    path('', index_view, name='index'),    # 下载    path('download/', download_view, name='download')]

2-6 编写模板文件

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

其中

  • form 代表视图函数传过来的表单实体对象

  • form.as_p 代表以字段格式渲染所有的表单元素

# index App upload.html        主页-上传文件
{% csrf_token %} {{ form.as_p }}

2-7 上传视图函数

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

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

# index App views.pydef 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.pydef 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

以上是"Django如何实现文件上传下载"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

文件 项目 数据 数据库 模板 函数 功能 模型 表单 视图 配置 代表 名称 文件夹 上传下载 成功 根目录 目录 篇文章 路径 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 四川在线网络安全 软件开发四五千笔记本电脑推荐 阿里云搭建服务器 网络安全知识问答高校组 网络安全案例演讲结尾 珠海市网络安全委员会 软件开发算工业还是商业 静海区网络技术售后保障 广东网络技术进出口 网络安全商业模式转变 服务器采购建设方案 浏览器与服务器断开连接怎么处理 职业学校计算机网络技术学什么 粮食绘画软件开发 安徽通信软件开发品质保障 软件开发高中学历可以吗 有线网络安全性的特点 政治网络安全八年级知识 松江区辅助软件开发技术指导 id网络安全管理系统默认密码 服务器网页登录怎么修改账户密码 苹果手机的服务器是什么 时序数据库单机集群 嘉兴南湖区靠谱软件开发 配置终端访问服务器 阿里云桌面配置服务器 普通服务器机柜型号 oracle数据库第84讲 数据库甲方要求 stem怎么连接stem服务器
0