You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中实现自定义大文件上传处理器直传S3

Django中转式S3直传自定义文件处理器方案探讨

我正在基于Django开发类Reels功能,探索多种大文件上传实现方案。最初发现直接上传至S3是最优解,但现在需求变更为通过服务器中转且尽可能降低服务器负载。

Django默认会根据文件大小,使用MemoryFileUploadHandler或TemporaryFileUploadHandler将文件临时存储在内存或磁盘中。我希望实现一个自定义文件处理器,直接将文件数据上传至S3,完全不占用服务器的内存或磁盘资源。目前不确定该方案是否可行——即便是分块处理,似乎文件数据仍会暂时留存于服务器中。

我正在寻找可行方案,实现自定义文件处理器直接将文件块上传至S3,全程不写入或读取服务器本地存储。

已尝试的代码实现

自定义上传处理器

import boto3

class S3ChunkedUploadHandler:
    def __init__(self, upload_path, filename):
        self.upload_path = upload_path
        self.filename = filename
        self.file = open(upload_path, 'ab')

    def receive_data_chunk(self, raw_data, start):
        self.file.write(raw_data)

    def file_complete(self, file_size):
        self.file.close()
        self.upload_to_s3()

    def upload_to_s3(self):
        s3_client = boto3.client('s3')
        with open(self.upload_path, 'rb') as file:
            s3_client.upload_fileobj(file, AWS_STORAGE_BUCKET_NAME, self.filename)

对应API视图

from rest_framework.views import APIView
from .custom_uploaders import S3ChunkedUploadHandler

class FileUploadView(APIView):
    def put(self, request, format=None):
        upload_path = '/tmp/uploaded_file.dat'  # Specify the temporary file path
        desired_filename = 'uploaded_file.dat'  # Specify the desired filename
        upload_handler = S3ChunkedUploadHandler(upload_path, desired_filename)
        request.upload_handlers.insert(0, upload_handler)
        return Response(status=status.HTTP_200_OK)

目前上述实现仍需依赖服务器本地临时文件,自定义处理器的核心价值(降低服务器负载)并未体现。

Django文档提到:“您可以编写自定义处理器来定制Django处理文件的方式。例如,您可以使用自定义处理器实施用户级配额、实时压缩数据、渲染进度条,甚至直接将数据发送到其他存储位置而不本地存储。有关如何自定义或完全替换上传行为的详细信息,请参阅编写自定义上传处理器。”

内容的提问来源于stack exchange,提问作者Abhey Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:17:41