如何在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
相关产品推荐
相关产品推荐

