首页 > 解决方案 > 上传文件时,有什么方法可以绕过托管我的 Django 站点的服务器,而是立即上传到 S3?

问题描述

我正在使用 boto3 将大量媒体文件(2GB+)从我的 Django 网站上传到 s3 存储桶。我的问题是上传大于 2.5MB 的文件时 - 连接立即超时并且没有调试信息显示

# method to chunk the upload process if file is over 2.4MB
def s3_multipart_upload(f, video_id):

    # our server path
    file_path = "media/"
    new_folder = str(video_id)+"/"
    file_name = f.name
    server_path = file_path + new_folder + file_name

    # the file gets copied to ~/tmp/ so grab that path 
    local_path = f.temporary_file_path()

    # create s3 client connection
    s3 = boto3.client('s3', settings.AWS_S3_REGION_NAME, **credentials)

    config = TransferConfig(
        multipart_threshold=1024 * 25,
        max_concurrency=10,multipart_chunksize=1024 * 25,
        use_threads=True
    )

    s3.upload_file(
        local_path,
        settings.AWS_STORAGE_BUCKET_NAME,
        server_path,
        ExtraArgs={'ACL': 'public-read'},
        Config=config,
        Callback = ProgressPercentage(local_path)
    )

    return

我希望能够直接从我的网站直接上传到 S3,而不需要文件通过服务器(任何地方的 python)。如果有更清洁的方法,我应该使用更好的服务器,或者如果有一种方法可以上传文件而无需先复制到 temp - 我全神贯注。

(一般来说,我也是 Python/Django/Servers 的新手,因此感谢您的帮助)

标签: djangoamazon-s3boto3python-3.7pythonanywhere

解决方案


我不确定您是否找到了答案,但您可以使用签名 url 机制将内容直接上传到 s3。

  1. 从 django 后端请求 s3 的签名 URL
  2. 使用前端将内容目录上传到 s3

但我建议仅当您要上传更大的媒体文件时才这样做。

我发现这是安全的方法。 https://www.serverless.com/blog/s3-one-time-signed-url


推荐阅读