174.Django中文件上传和下载

news2024/11/16 7:45:55

1. 文件上传和下载环境搭建

  1. 创建django项目和子应用
  2. urls中包含子应用,在子应用中创建urls.py
  3. 配置数据库sqlite3(默认就是,无需配置)
  4. 配置settings,上传文件目录
  5. 编写模型代码(下面给出)
  6. 模型的预迁移和迁移
  7. Nacicat创建数据库,然后查看表
  8. 根目录下创建文件夹media
  9. 可以翻阅本专栏,前面都有介绍

models.py

from django.db import models

# Create your models here.

# 上传文件
class UploadFileImg(models.Model):
    # 上传普通文件
    file = models.FileField(upload_to="files/")
    # 上传图片
    img = models.ImageField(upload_to='imgs/')
    remark = models.CharField(max_length=100)

在这里插入图片描述
settings

ROOT_URLCONF = 'file_study.urls'
import os
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'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',
            ],
        },
    },
]
# 配置上传文件路径
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')

根urls

from django.contrib import admin
from django.urls import path,include

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

# 上传文件配置
from django.conf import settings
from django.conf.urls.static import static

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)

2. 文件上传admin管理

配置admin.py

from django.contrib import admin
from file_app.models import UploadFileImg
# Register your models here.

admin.site.register(UploadFileImg)

创建管理用户
在这里插入图片描述
访问admin
在这里插入图片描述
测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 前端显示和下载

views

from django.shortcuts import render
from file_app.models import UploadFileImg
# Create your views here.
# 根据pk获取UploadFileImg对象
def file_admin(request,pk):
    upload_file_img = UploadFileImg.objects.get(pk=pk)
    return render(request,'file_app/file_admin.html', {'upload_file_img':upload_file_img})


templates

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>admin管理文件上传</title>
</head>
<body>
    <ul>
        <li>备注:{{ upload_file_img.remark }}</li>
        <li>图片名称:{{ upload_file_img.img.name }}</li>
        <li><img src="{{ upload_file_img.img.url }}"></img>></li>
        <!-- 点击链接进行下载 -->
        <li><a href="{{ upload_file_img.file.url }}">{{ upload_file_img.file.name }}</a></li>
    </ul>
</body>
</html>

效果展示
在这里插入图片描述

4.上传文件高阶功能——重复文件名保存处理

4.1 问题概述

当我们保存文件时候,多个同样名称的文件进行保存时,会出现异常,这里,我们将使用时间戳的方式区分文件。
FileField和ImageField类的属性upload_to,除了可以填写字符串,例如:‘imgs/’,还可以指定一个自定义函数,用于根据文件模型实例以及文件信息做一些额外操作,譬如:单独设置目录

4.2 操作流程

models模型

from django.db import models
import time
import os
# Create your models here.
def upload_to_func(instance, filename):
    '''
    上传图片路径
    :param instance:模型对象实例
    :param filename:文件名
    :return: 保存的路径
    '''
    try:
        #filename 是aa.txt
        index = filename.index('.')
        # aa
        pre = filename[:index]
        # .txt
        sub = filename[index:]
    except:
        # 文件名直接是 aa
        pre = filename
        sub = ''
    # aa_10位时间戳数字.txt
    filename = f'{pre}_{int(time.time())}{sub}'
    return os.path.join(instance.typ,filename)


class UploadFileImgAdvance(models.Model):
    typ = models.CharField(max_length=10, null=True)
    file = models.FileField(upload_to=upload_to_func)
    img = models.ImageField(upload_to=upload_to_func)

迁移数据库
创建admin对象

from django.contrib import admin
from file_app.models import UploadFileImg,UploadFileImgAdvance
# Register your models here.

admin.site.register(UploadFileImg)
admin.site.register(UploadFileImgAdvance)

登录/admin添加文件
在这里插入图片描述

创建视图类,前端显示和下载文件

from django.shortcuts import render
from file_app.models import UploadFileImg,UploadFileImgAdvance
from django.http import Http404
# Create your views here.
def file_advance(request,pk):
    try:
        uploadFileImg = UploadFileImgAdvance.objects.get(pk=pk)
        return render(request, 'file_app/file_admin_adv.html', {'uploadFileImg': uploadFileImg})
    except:
        raise Http404

templates

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>admin管理的文件显示</title>
</head>

<body>
    <ul>
        <li>
            类型:{{ uploadFileImg.typ }}
        </li>
        <li>
            图片名:{{uploadFileImg.img.name }}
        </li>
        <li>
            <img src="{{uploadFileImg.img.url }}">
        </li>
        <li>
            <a href="{{uploadFileImg.file.url }}">{{uploadFileImg.file.name }}</a>
        </li>
    </ul>
</body>

</html>

在这里插入图片描述

5.文件上传自定义管理

5.1 概述

不使用admin后台管理上传文件,使用自己渲染的页面进行上传

5.2 操作流程

创建模型,迁移模型

from django.db import models
import time
import os
def upload_to_func(instance, filename):
    '''
    上传图片路径
    :param instance:模型对象实例
    :param filename:文件名
    :return: 保存的路径
    '''
    try:
        #filename 是aa.txt
        index = filename.index('.')
        # aa
        pre = filename[:index]
        # .txt
        sub = filename[index:]
    except:
        # 文件名直接是 aa
        pre = filename
        sub = ''
    # aa_10位时间戳数字.txt
    filename = f'{pre}_{int(time.time())}{sub}'
    return os.path.join(instance.typ,filename)
class UploadFileImgDIY(models.Model):
    typ = models.CharField(max_length=10, null=False)
    file = models.FileField(upload_to=upload_to_func)
    img = models.ImageField(upload_to=upload_to_func)

views

from django.shortcuts import render
from file_app.models import UploadFileImg,UploadFileImgAdvance,UploadFileImgDIY
from django.http import Http404, HttpResponse
def file_diy(request):
    if request.method == 'POST':
        # 获取表单中的数据
        typ = request.POST.get('typ')
        img = request.FILES.get('img')
        file = request.FILES.get('file')
        upload_file_diy =  UploadFileImgDIY.objects.create(
            typ = typ,
            img = img,
            file = file
        )
        return HttpResponse(f'文件上传成功,id:{upload_file_diy.pk}')
    else:
        return render(request, "file_app/file_diy.html")

templates

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>自定义管理文件</title>
</head>
<body>
    <!-- 文件上传固定enctype -->
    <!-- form表单按钮执行方式,跳转到file_zidingyi:file_diy执行post -->
    <form action="{% url 'file_zidingyi:file_diy' %}" method="post" enctype="multipart/form-data">
        <!-- 文件上传表单时必须添加token,否则存在异常 -->
        {% csrf_token %}
        文件路径:<input type="text" name="typ"><br>
        图片:<input type="file" name="img"> <br>
        文件: <input type="file" name="file"> <br>
        <input type="submit" name="上传">
    </form>
</body>
</html>

效果展示
在这里插入图片描述

在这里插入图片描述

6.自定义文件下载

6.1 概述

在3和4中,我们使用html页面中的a标签进行文件下载,我们这里将在Django中使用StreamingHttpRespose实现自定义下载。
首先,应该创建视图函数,获取全部的页面,然后再创建视图函数进行下载的操作

6.2 操作流程

views

from django.shortcuts import render
from file_app.models import UploadFileImg,UploadFileImgAdvance,UploadFileImgDIY
from django.http import Http404, HttpResponse, StreamingHttpResponse
def file_diy_list(request):
    # 查询所有上传的文件
    file_diy_list = UploadFileImgDIY.objects.all()
    return render(request, "file_app/file_diy_list.html", {"file_diy_list":file_diy_list})
def file_diy_download(request):
    # 获取 记录id
    id = request.GET.get('id')
    # 得到模型实例对象
    upload_file_img_diy = UploadFileImgDIY.objects.get(pk = id)
    # 得到模型的FileField属性,获取文件的相对路径
    file = upload_file_img_diy.file
    # print("file:",file)
    # 得到FileField类的file属性,是一个文件对象, 获取到文件存放的绝对路径
    file_diy = file.file
    # print("file_diy:",file_diy)
    # 通过StreamingHttpResponse进行文件下载,传入的参数为文件的字节内容
    response = StreamingHttpResponse(file_diy.read())
    # 通过分割,将diy/test1_123451.csv获取到test1_123451.csv
    name = file.name.split('/')[-1]
    # 附件模式
    # 要进行编码和解码,以为http协议规定,响应头的编码格式必须是ISO-8859-1
    response['Content-Disposition'] = 'attachment;filename=' + name.encode('utf-8').decode('ISO-8859-1')
    return response

templates

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>自定义文件下载</title>
</head>
<body>
    <ul>
        {% for file in file_diy_list %}
        <li>
            id:{file.id}
            typ:{file.typ}
            <!-- 跳转到下载的视图函数中 -->
            <a href="{% url 'file_zidingyi:file_diy_download' %}?id={{file.id}}">下载普通文件</a>
        </li>
        
        {% endfor %}
    </ul>
</body>
</html>

urls

from django.contrib import admin
from django.urls import path,include
from file_app import views
app_name = 'file_zidingyi'
urlpatterns = [
    path('file_admin/<int:pk>/',views.file_admin),
    path('file_advance/<int:pk>/',views.file_advance),
    path('file_diy/',views.file_diy, name='file_diy'),
    path('file_diy_list/',views.file_diy_list),
    path('file_diy_download/',views.file_diy_download,name='file_diy_download'),
]

效果展示
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用Java获取货币符号?

1. 前言 最近做了一个支付相关的需求&#xff0c;要求在收银台页面显示商品的价格时带上货币符号&#xffe5;&#xff0c;类似下图中的格式&#xff1a; 最初我是用的下面这样的代码&#xff1a; System.out.println(Currency.getInstance(Locale.CHINA).getSymbol());本机测…

postgresql_internals-14 学习笔记(一)

梳理一下之前理解不太清楚的知识点&#xff0c;重点内容可能会再拆出来单独研究。 原书链接&#xff1a;Index of / 一、 数据组织 1. pg系统库 template0&#xff1a;用于从逻辑备份还原&#xff0c;或创建不同字符集的数据库&#xff0c;不可以修改template1&#xff1a;真…

[附源码]Python计算机毕业设计SSM基于框架的毕业生就业管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Unity脚本 (1) --- 创建脚本以及挂载脚本的本质,脚本模板的修改

值类型 --- 在栈区中开辟内存空间并直接存储在栈区中&#xff0c;引用类型 --- 在栈区中开辟内存空间存引用&#xff0c;在堆区中开辟内存空间存数据&#xff08;有可能堆区中还要开辟引用&#xff09;&#xff0c;然后将堆区中存储数据的内存空间的地址传给引用接收 什么是脚本…

HTTP 请求走私

目录 0x01 简介 0x02 成因 2.1 Keep-Alive 2.2 Pipeline 2.3 Content-Length 2.4 Transfer-Encoding 0x03 分类 0x04. 攻击 4.1. CL不为0的GET请求 4.2 CL-CL 4.3 CL-TE 4.4 TE-CL 4.5. TE-TE 0x05 防御 参考资料&#xff1a; 0x01 简介 HTTP请求走私是一种干扰…

Mysql优化-全面详解(学习总结---从入门到深化)

Sql性能下降的原因 在程序的运行过程中&#xff0c;我们会发现这样的一个现象&#xff0c;随着程序运行 时间的不断推移以及数据量越来越大&#xff0c;程序响应的时间逐渐变慢&#xff0c; 程序变得卡顿&#xff0c;但最开始的时候并不是这样的&#xff0c;那是什么原因导致 的…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java毕业生回访系统564c4

最近发现近年来越来越多的人开始追求毕设题目的设创、和新颖性。以往的xx管理系统、xx校园系统都过时了。大多数人都不愿意做这类的系统了&#xff0c;确实&#xff0c;从有毕设开始就有人做了。但是很多人又不知道哪些毕设题目才算是新颖、创意。太老土的不想做&#xff0c;创…

RISC-V SiFive U64内核——HPM硬件性能监视器

学习、沉淀、分享&#xff0c;才能有所获~ 文章目录HPM简介性能监控计数器重置行为固定功能性能监控计数器事件可编程性能监控计数器事件选择器寄存器事件选择器编码计数使能寄存器对于性能分析&#xff0c;通常我们会使用Perf工具。而perf中的硬件事件&#xff0c;则需要硬件的…

阿里、腾讯、字节跳动大厂Java岗面试秘籍!(含答案解析)

本文主要是汇集整理了最新的阿里、腾讯、字节跳动大厂面试真题及答案解析&#xff0c;以及面试中被频繁问到的内容&#xff0c;主要作为参考大纲&#xff0c;供大家互相学习。 一、阿里篇&#xff08;27题&#xff09; 1.1.1 如何实现一个高效的单向链表逆序输出&#xff1f;…

当我用ChatGPT中学习CNN卷积神经网络时...

本文节选自本人博客&#xff1a;https://www.blog.zeeland.cn/archives/chatgpt-asoihgoihrx Introduction ChatGPT大火&#xff0c;在这一段时间并没有觉得ChatGPT特别厉害&#xff0c;最多就是一个基于生成式对话的NLP模型罢了&#xff0c;直到我看到了AI扮演Linux虚拟机&am…

[附源码]计算机毕业设计基于web的建设科技项目申报管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【Redis】Redisson 分布式锁主从一致性问题

一、主从一致性问题的产生 Redis 主从集群使用如下&#xff1a; 在主节点进行数据的写操作&#xff1b;在节点进行数据的读操作&#xff1b;主节点向从节点同步数据。 主从一致性问题&#xff1a; 当主节点还没来得及将锁信息同步到从节点时&#xff0c;此时主节点宕机了。然…

【产品分析】高德手机地图产品:未来搜索将从地图开始

未来的搜索从地图开始。今后的所有商务活动都将通过地图展开&#xff0c;使之成为兵家必争之地。要将移动流量变现为真金白银&#xff0c;地图将发挥至关重要的作用。 目前整个中国电子地图市场目前处于应用成熟期。在多年的快速发展和数次大型收购后&#xff0c;各互联网巨头已…

[附源码]计算机毕业设计家庭教育appSpringboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

腾讯在线文档根据单选的内容修改背景颜色

目录 [介绍] [条件格式] [添加条件格式] [选择单元格范围] [条件选择] [格式预览] [管理条件格式] [介绍] 类似我这种场景(见下图),单选选择不同的状态,有时为了一目了然的看清状态,需要给单元格加上不同的背景颜色,但手动使用格式刷比较麻烦,琢磨了下根据单元格选项动态…

【云原生】Nacos 监控手册

Nacos 0.8.0版本完善了监控系统&#xff0c;支持通过暴露metrics数据接入第三方监控系统监控Nacos运行状态&#xff0c;目前支持prometheus、elastic search和influxdb&#xff0c;下面结合prometheus和grafana如何监控Nacos&#xff0c;官网grafana监控页面。 搭建Nacos集群暴…

HTML入门零基础教程(六)

嗨&#xff0c;大家好&#xff0c;我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助&#xff0c;请支持一波。 希望未来可以一起学习交流。 目录 一、图像的路径 1.路径&#xff08;前期铺垫知识&#xff09; 2.VSCode打开目录文件夹&#xff1a; 3.路…

java计算机毕业设计ssm医院病床管理系统ft4fz(附源码、数据库)

java计算机毕业设计ssm医院病床管理系统ft4fz&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

Kafka集群搭建

集群应用场景 &#xff08;1&#xff09;消息传递 Kafka可以很好地替代传统邮件代理。消息代理的使用有多种原因&#xff08;将处理与数据生产者分离&#xff0c;缓冲未处理的消息等&#xff09;。与大多数邮件系统相比&#xff0c;Kafka具有更好的吞吐量&#xff0c;内置的分…

Java项目:SSM会议室预约系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目包含管理员与用户两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登陆,会议室管理,预约审核管理,用户注册等功能。 用…