【问题标题】:Allow user to download zip file generated on AWS允许用户下载在 AWS 上生成的 zip 文件
【发布时间】:2018-12-15 20:29:02
【问题描述】:

这是我如何生成 ZIP 并从服务器下载它,它在本地开发中运行良好。

import zipfile
doc = get_object_or_404(Document,id=id_obj)
filepath = doc.file.path
filename = os.path.basename(doc.file.name)
directory = os.path.dirname(filepath)

xzip = zipfile.ZipFile(os.path.join(directory,"%s.zip" % filename), "w")
xzip.write(filepath,filename)
xzip.close()

zip_file = open(xzip.filename, 'rb')
response = HttpResponse(zip_file, content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename="%s.zip"' % 
                                   os.path.splitext(filename)[0]
return response

我所有的静态和媒体文件都在生产环境中上传到 AWS。所以我改变了一点

 # filepath becomes
 filepath = settings.MEDIA_ROOT + "/" + doc.file.name

但是当我尝试下载它时,它给了我[Errno 2] No such file or directory的链接:

https://bucket_name.s3.amazonaws.com/media/public/files/file.pdf.zip

settings.MEDIA_ROOT 是:

AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY')

AWS_STORAGE_BUCKET_NAME = 'bucket_name'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME

AWS_PUBLIC_MEDIA_LOCATION = 'media/public'
MEDIA_ROOT = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_PUBLIC_MEDIA_LOCATION)

doc.file.path 给了我错误:'This backend doesn't support absolute paths',这就是我改成MEDIA_ROOT + doc.file.name 的原因

如何从 AWS 下载生成的 zip 文件?

【问题讨论】:

    标签: python django amazon-web-services amazon-s3 zipfile


    【解决方案1】:

    该文件存在于 S3 上,而不是本地文件系统上。当您调用这些 os.path.* 函数时,代码会尝试在本地文件系统上查找文件。它给你这个错误是因为你给它的 S3 URL 作为路径不能映射到本地文件系统上的任何东西。

    为什么不允许 S3 通过简单地返回带有 S3 文件 URL 的重定向响应而不是尝试读取文件并返回响应中的内容来将文件直接提供给最终用户的浏览器?

    【讨论】:

    • 好的,我明白了!你能告诉我怎么做吗?
    • 类似return HttpResponseRedirect(settings.MEDIA_ROOT + "/" + doc.file.name)
    • 请注意,我试图在一切之前创建一个 zip 文件。 xzip = zipfile.ZipFile(os.path.join(directory,"%s.zip" % filename), "w") OP 显示它。你在说这个吗? .... 因为return HttpResponseRedirect 只会生成文件
    • 我错过了拉链部分。在这种情况下,您将需要先使用 AWS 开发工具包将文件从 S3 复制到本地文件系统,然后压缩它们,然后提供 zip 文件。
    • 很高兴您知道并尝试解释,请您在答案中添加一个示例!
    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    相关资源
    最近更新 更多