Django实现文件上传及下载的方式,FileSystemStorage和StreamingHttpResponse的使用

文件保存的路径配置

import platform

system = platform.system()  # 获取当前系统类型
if system == "Windows":  # 测试环境
    MEDIA_ROOT = "F:/Download/media/"
    DOMAIN = "http://127.0.0.1/"
elif system == "Linux":  # 线上环境
    MEDIA_ROOT = "/mnt/media/"
    DOMAIN = "http://xxxx.com/"
else:
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
    DOMAIN = "http://127.0.0.1/"

# print(MEDIA_ROOT)

MEDIA_URL = '/media/'

一、文件上传

1,使用自带的FileSystemStorage类

简单功能实现

from django.views import View
from django.core.files.storage import FileSystemStorage


class SingleMediaView(View):
    def post(self, request):
        file = request.FILES.get('file', None)
        # 保存上传的文件到指定的绝对目录
        fs = FileSystemStorage()
        real_path = settings.MEDIA_ROOT + format_filename
        fs.save(real_path, file)
        return JsonResponse({"status": 200, "msg": "上传成功"})
2,使用open函数
from django.views import View


class SingleMediaView(View):
    def post(self, request):
        file = request.FILES.get('file', 'None')
       
        with open('path/file.txt', 'wb+') as destination:
            for chunk in file.chunks():
                destination.write(chunk)
        return JsonResponse({"status": 200, "msg": "上传成功"})

 open函数的第一方法写具体保存文件的路径

二、下载文件

使用StreamingHttpResponse类

class DownloadFileView(View):
    """文件下载"""
    def get(self, request):
        file_id = request.GET.get("file_id", None)  # 文件id

        if file_id:
            media = Media.objects.get(id=file_id)  # 查询数据库
            real_path = settings.MEDIA_ROOT + media.url  # 获取文件路径

            # 使用StreamingHttpResponse进行大文件下载,不占内存
            def file_iterator(file_path, chunk_size=8192):
                with open(file_path, 'rb') as file:
                    while True:
                        data = file.read(chunk_size)
                        if not data:
                            break
                        yield data

            file_format = media.format
            response = StreamingHttpResponse(file_iterator(real_path))
            if media.type == 1:  # 图片下载
                response['Content-Type'] = f'image/{file_format}'
            elif media.type == 2:  # 视频下载
                response['Content-Type'] = f'video/{file_format}'
            elif media.type == 3:  # 其他类型文件下载
                response['Content-Type'] = 'application/octet-stream'

            # 使用quote对下载的中文文件名进行url编码,否则在Content-Disposition里的filename无法正确识别
            encoded_string = quote(f'{media.title}.{file_format.lower()}')
            response['Content-Disposition'] = f'attachment; filename="{encoded_string}"'

            return response

为DownloadFileView类视图配置url后请求时就可以直接下载了

相关推荐

  1. 前端文件方式

    2024-03-15 05:08:03       24 阅读
  2. C#实现HTTP文件方法

    2024-03-15 05:08:03       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-15 05:08:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-15 05:08:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-15 05:08:03       87 阅读
  4. Python语言-面向对象

    2024-03-15 05:08:03       96 阅读

热门阅读

  1. 旅游市场游客满意度调查报告

    2024-03-15 05:08:03       35 阅读
  2. 视觉语言导航

    2024-03-15 05:08:03       37 阅读
  3. Winform编程详解二:Button 按钮

    2024-03-15 05:08:03       39 阅读
  4. thinkphp6.1~8.0 快速创建CRUD

    2024-03-15 05:08:03       37 阅读
  5. 高德地图2025届算法笔试3.12

    2024-03-15 05:08:03       41 阅读
  6. 计算机视觉

    2024-03-15 05:08:03       37 阅读
  7. Linux——GlusterFS分布式文件系统群集

    2024-03-15 05:08:03       30 阅读
  8. OpenCV亮度对比度调节

    2024-03-15 05:08:03       39 阅读
  9. 机器视觉学习(三)—— 保存视频流

    2024-03-15 05:08:03       38 阅读