从零教你实现django的前后端分离模式文件上传下载功能实现(2024最新)

文章目录

      • 项目初始化配置
      • 具体文件上传下载代码的实现
        • 数据库模型类建立
      • 运行测试

项目初始化配置

1.使用pycharm编辑器新建一个django项目
2.Terminal终端下载需要的依赖包

# 和数据库建立连接的依赖包
pip install mysqlclient
# 解决跨域问题的依赖包
pip install django-cors-headers

3.Terminal注册一个需要的app

python manage.py startapp users

4.修改settings.py里面的部分配置信息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5.主路由和子路由的修改配置
5.1主路由(sky指的是你python manage.py startapp "你的名称,根据自己的来)
在这里插入图片描述
5.2子路由:在你的sky文件下面创建urls.py,并填写以下内容
在这里插入图片描述
6.数据库迁移,终端输入以下语句

python manage.py makemigrations
python manage.py migrate

具体文件上传下载代码的实现

数据库模型类建立

1.在sky/models.py书写以下代码

from django.db import models


# Create your models here.
class UploadedFile(models.Model):
    file = models.FileField(upload_to='uploads/')
    uploaded_at = models.DateTimeField(auto_now_add=True)
    mime_type = models.CharField(max_length=100, default="")  # 添加mime_type字段

    def __str__(self):
        return self.file.name

2.再次执行迁移文件,将数据库表迁移

python manage.py makemigrations
python manage.py migrate

3.在sky/views下书写以下代码(上传/下载/时间获取接口)

import os

from django.http import JsonResponse, HttpResponse
from .models import UploadedFile

# 定义一个字典,用于将文件扩展名映射到 MIME 类型
MIME_TYPES = {
    '.txt': 'text/plain; charset=utf-8',
    '.pdf': 'application/pdf',
    '.xls': 'application/vnd.ms-excel',
    '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    '.kmz': 'application/vnd.google-earth.kmz',
    # 添加其他文件类型的映射
}


# 文件上传接口
def upload_file(request):
    if request.method == 'POST' and request.FILES.get('file'):
        uploaded_file = request.FILES['file']
        # 获取文件扩展名,了解是上传的什么类型的文件
        file_extension = os.path.splitext(uploaded_file.name)[1].lower()

        # 获取文件类型的 MIME 类型(application/octet-stream标识默认返回类型)
        mime_type = MIME_TYPES.get(file_extension, 'application/octet-stream')

        # 保存文件时同时保存文件类型信息
        uploaded_file_object = UploadedFile.objects.create(
            file=uploaded_file,
            mime_type=mime_type  # 保存文件类型信息
        )

        # 其他处理逻辑...
        return JsonResponse({'success': True, 'file_id': uploaded_file_object.id})
    else:
        return JsonResponse({'error': 'File not provided'})


# 文件下载接口
def download_file(request, file_id):
    try:
        upload_file = UploadedFile.objects.get(id=file_id)
        file_path = upload_file.file.path

        # 获取文件类型信息
        mime_type = upload_file.mime_type

        with open(file_path, 'rb') as file:
            response = HttpResponse(file.read(), content_type=mime_type)
            response['Content-Disposition'] = 'attachment; filename=' + os.path.basename(file_path)
            return response
    except UploadedFile.DoesNotExist:
        return JsonResponse({'error': 'File not found'})


# 删除文件接口
def delete_file(request, file_id):
    if request.method == 'DELETE':
        try:
            uploaded_file = UploadedFile.objects.get(id=file_id)
            file_path = uploaded_file.file.path

            # 从数据库中删除文件记录
            uploaded_file.delete()

            # 删除文件
            if os.path.exists(file_path):
                os.remove(file_path)

            return JsonResponse({'success': True})
        except UploadedFile.DoesNotExist:
            return JsonResponse({'error': 'File not found'})
    else:
        return JsonResponse({'error': 'Method not allowed'}, status=405)


# 获取文件上传时间接口
def get_upload_time(request, file_id):
    try:
        uploaded_file = UploadedFile.objects.get(id=file_id)
        upload_time = uploaded_file.uploaded_at.strftime("%Y-%m-%d %H:%M:%S")
        return JsonResponse({'upload_time': upload_time})
    except UploadedFile.DoesNotExist:
        return JsonResponse({'error': 'File not found'})

4.sky/urls路由配置信息

# 应用程序目录下的 urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('uploadfile/', views.upload_file),
    path('downloadfile/<int:file_id>/', views.download_file),
    path('deletefile/<int:file_id>/', views.delete_file),
    path('getUpdateTime/<int:file_id>/', views.get_upload_time)
]

运行测试

1.运行项目
Terminal执行

python manage.py runserver

2.使用postman测试上传功能和下载功能
注意红框部分要和我一致
上传:
在这里插入图片描述
下载:
在这里插入图片描述
测试成功。上传下载功能实现

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用阿里云OSS实现视频上传功能

目录 前言 视频上传 前言 阿里云对象存储服务&#xff08;OSS&#xff09;作为一种高可用、高扩展性的云端存储服务&#xff0c;为开发者提供了便捷、安全的对象存储解决方案。本文将介绍如何利用阿里云OSS实现视频上传功能。 视频上传 前期准备请看阿里云OSS文件上传和下载…

颜色空间的选择

1.选择Gamma颜色空间&#xff0c;Web平台或者不支持线性空间&#xff0c;或者追求高饱和度的 2.选择Linear&#xff0c;追求真实光照和物理准确

9、C#【进阶】特性

特性 文章目录 1、特性概念2、自定义特性 Attribute3、特性的使用4、限制自定义特性的使用范围5、系统自带特性1、过时特性2、调用者信息特性3、条件编译特性4、外部dll包函数特性 1、特性概念 特性是一种允许我们向程序的程序集添加元数据的语言结构 它是用于保存程序机构信息…

Springboot启动时报错Property ‘mapperLocations‘ was not specified.

这几天没整boot 晚上直接运行不了了 本想是在表现层写点代码测测接口的 localhost8080找半天 结果404 先考虑好久 是不是url输入错了 然后 就发现 结果boot都不能启动了 JUnit也测不出来 找了半天 结果是开关机导致数据库没开 手动打开服务 找到MySQL启动 IDEA连接数据…

Istio ICA考试之路---2-6

Istio ICA考试之路---2-6 1. 题目2. 解题2.1 获取模板2.3 整理yaml 3. 测试 1. 题目 Using Kubernetes context cluster-2 Create and configure Istio resources necessary for routing all traffic destined for http://example.org through the default Istio egress gat…

PLC远程调试

随着工业自动化的快速发展&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;已经成为现代工业生产线的核心控制设备。然而&#xff0c;传统的PLC调试方式往往受限于地理位置和物理连接&#xff0c;使得工程师在调试过程中面临诸多不便。在这个背景下&#xff0c;HiWoo …

河道流量监测解决方案 河道水位监测 水质在线监测-计讯物联科技

在城市河道与入海口间的通道施工项目中&#xff0c;拦水坝不仅承担着调节水流、保护生态平衡的使命&#xff0c;也是确保施工区域安全的关键屏障。当前&#xff0c;项目团队面临着严峻的挑战&#xff1a;水位的异常上升和流量的急剧变化&#xff0c;这些都可能对拦水坝的稳定性…

YOLO训练报错解决:OSError: [WinError 1455] 页面文件太小,无法完成操作

问题&#xff1a;OSError: [WinError 1455] 页面文件太小&#xff0c;无法完成操作。 Error loading "C:\Users\12706.conda\envs\yolov8\lib\site-packages\torch\lib\cudnn_cnn_infer64_8.dll" or one of its dependencies. 解决方法&#xff1a; 降低数据加载的线…

SpringSecurity登录和校验流程简述

认证&#xff1a; 验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户 授权&#xff1a; 经过认证后判断当前用户是否有权限进行某个操作 一、入门案例实现 搭建springboot工程后&#xff0c;创建启动类和Controller&#xff0c;引入SpringSecurity依…

Spring Cache基本使用

Spring 从 3.1 版本开始定义缓存抽象来统一不同的缓存技术&#xff1b;在应用层面与后端存储之间&#xff0c;提供了一层抽象&#xff0c;这层抽象目的在于封装各种可插拔的后端存储( ehcache, redis, guava)&#xff0c;最小化因为缓存给现有业务代码带来的侵入。 一、Spring…

【代码随想录】面试常考类型之动态规划01背包

前言 更详细的在大佬的代码随想录 (programmercarl.com) 本系列仅是简洁版笔记&#xff0c;为了之后方便观看 不同的二叉搜索树 96. 不同的二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 通过举例子发现重叠子问题 代码很简单&#xff0c;主要是思路问题&#xff0…

AD使用问题

设计流程&#xff1a; 1.先创建项目——添加原理图&#xff0c;原理图库&#xff0c;PCB&#xff0c;PCB库 2.画原理图库和封装库 主要有三种方法&#xff1a; &#xff08;1&#xff09;手动画库和封装&#xff0c;常常用于嘉立创查询不到的器件 &#xff08;2&#xff0…

spark的简单学习二

一 spark sql基础 1.1 Dataframe 1.介绍&#xff1a; DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表 格&#xff0c;除了数据以外&#xff0c;还掌握数据的结构信息&#xff0c;即schema。同时&#xff0c;与Hive类似&#xff0c;DataFrame也支 持…

6、xss-labs之level8

1、测试分析 传入123查看页面源码&#xff0c;发现传入的值传给了value和a标签的href&#xff0c;并且对特殊字符<>" 都进行了HTML实体化&#xff0c;对于大小写进行了转化&#xff0c;过滤掉了src、data、onfocus、href、script、"&#xff08;双引号&#…

边缘计算网关的主要功能有哪些?天拓四方

随着物联网&#xff08;IoT&#xff09;的快速发展和普及&#xff0c;边缘计算网关已经成为了数据处理和传输的重要枢纽。作为一种集成数据采集、协议转换、数据处理、数据聚合和远程控制等多种功能的设备&#xff0c;边缘计算网关在降低网络延迟、提高数据处理效率以及减轻云数…

Discourse 编辑没有办法显示更多的 JS 错误

Priority/Severity: High Platform: 3.3.0.beta3-dev UI bugs Description: 昨天升级的时到最新版本的时候就发现有这个错误&#xff0c;是 JS 的错误。 发了一个帖子到官方的网站上&#xff0c;官方说可能是插件的问题。 但是我们实在是没有安装什么插件呀&#xff1f; 官方…

Beego 使用教程 8:Session 和 Cookie

beego 是一个用于Go编程语言的开源、高性能的 web 框架 beego 被用于在Go语言中企业应用程序的快速开发&#xff0c;包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado&#xff0c; Sinatra 和 Flask beego 官网&#xff1a;http://beego.gocn.vip/ 上面的 be…

地下18米的科技守护:旗晟综合管廊巡检机器人

近日&#xff0c;安徽某业主的地下18米深的地下管廊处&#xff0c;一种先进的巡检机器人正活跃在管廊轨道上&#xff0c;执行着重要的巡检任务&#xff0c;只见机器人在管廊轨道上平稳前行&#xff0c;它搭载着先进的检测设备&#xff0c;对地下管廊内的各种设施进行监测巡检&a…

养猫久了才知道,为什么宠物空气净化器是养猫必备!效果惊人!

养猫是一件非常愉快的事情&#xff0c;猫咪的陪伴能带给我们无尽的欢乐和温暖。然而&#xff0c;随着时间的推移&#xff0c;许多养猫的朋友会发现一个问题&#xff0c;那就是家中的空气质量变差了&#xff0c;猫毛、异味等问题也随之而来。这时候&#xff0c;一款好的宠物空气…

【Python】 Python中的“命名元组”:简单而强大的数据结构

基本原理 在Python中&#xff0c;namedtuple是tuple的一个子类&#xff0c;它允许我们为元组的每个位置指定一个名字。这种数据结构非常适合用于需要固定字段和值的场景&#xff0c;例如数据库查询的结果或配置文件中的设置。 namedtuple提供了一种方便的方式来访问元组中的元…