如何在django中创建自定义文件上传句柄来处理大文件,而不使用MemoryFileUploadHandler和TemporaryFileUploadHandler

agyaoht7  于 2023-05-30  发布在  Go
关注(0)|答案(1)|浏览(94)

我一直致力于使用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)
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 Docs所述-“您可以编写自定义处理程序来自定义Django处理文件的方式。例如,您可以使用自定义处理程序来强制执行用户级配额,动态压缩数据,呈现进度条,甚至直接将数据发送到另一个存储位置而不将其存储在本地。有关如何自定义或完全替换上载行为的详细信息,请参阅编写自定义上载处理程序。”

qoefvg9y

qoefvg9y1#

如果您正在实现自己的分块写入器,则必须在分块写入期间实际连接到S3。正如您的代码所示,它正在创建一个文件,将分块连接写入该文件,然后尝试上传到S3,这不是直接的。
也许你应该check this article about how to use django-storages to do the direct upload
或者你可以先看看这个项目,它是claims to handle S3 uploads directly
当直接将文件推送到s3时,有很多事情需要考虑,包括但不限于安全策略和区域选择。在一天结束的时候,他们确实使用了分块文件上传策略,但这是社区正在努力的整个项目的原因。
有关分块编写器的代码示例,请查看此处和此处

相关问题