python - 允许用户下载在 AWS 上生成的 zip 文件
问题描述
这是我如何生成 ZIP 并从服务器下载它,它在本地开发中运行良好。
import zipfile
doc = get_object_or_404(文档,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 文件?
解决方案
该文件存在于 S3 上,而不是本地文件系统上。当您调用这些os.path.*
函数时,代码会尝试在本地文件系统上查找文件。它给你这个错误是因为你给它的 S3 URL 作为路径不能映射到本地文件系统上的任何东西。
为什么不允许 S3 通过简单地返回带有 S3 文件 URL 的重定向响应而不是尝试读取文件并返回响应中的内容来将文件直接提供给最终用户的浏览器?
推荐阅读
- macros - 在运行时处理内部变量和数据结构的 LISP 宏
- javascript - 垂直滚动 html webos 应用程序
- javascript - How to Export Variables with a Dynamic Names
- android - 如何使用 gps 提供跟踪用户位置的服务?
- javascript - 难以发出多个 api / http node.js 请求
- android - Network Only Resource From Livedata To RxJava
- linux - 跟踪 syslog() 调用的来源
- php - 使用 PHP/Symfony/Twig 将插件添加到简单的应用程序
- apache-nifi - Nifi Jolt 重复属性
- c# - Get Response Data in XML format in IRestResponse response = client.Execute(request);