python - 允许用户下载在 AWS 上生成的 zip 文件

标签 python django amazon-web-services amazon-s3 zip

这是我生成 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]没有这样的文件或目录以及链接:

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'
<b>MEDIA_ROOT = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_PUBLIC_MEDIA_LOCATION)</b>

doc.file.path 给我错误:'此后端不支持绝对路径',这就是我更改为 MEDIA_ROOT + doc 的原因。文件名

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

最佳答案

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

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

关于python - 允许用户下载在 AWS 上生成的 zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51223791/

相关文章:

python - 运行Python子进程直到不再发生错误?

python - 使用多个 Python 应用程序构建存储库

python - Mixin 覆盖继承的方法

amazon-web-services - 节点无法连接到Hub,继续发送注册事件

amazon-web-services - 使用 CLI 描述 AWS 中的策略

python - 按其中一个键的值拆分字典

javascript - 如何将 csrf_token 传递给 django 中的 javascript 文件?

python - Django +Vue。无法连接参数

Django 添加到监视列表 没有 Jquery

ruby-on-rails - CORS 与 Amazon S3 和 Cloudfront