Python 允许用户下载AWS上生成的zip文件
下面是我如何生成ZIP并从服务器下载它,它在本地开发中运行良好Python 允许用户下载AWS上生成的zip文件,python,django,amazon-web-services,amazon-s3,zipfile,Python,Django,Amazon Web Services,Amazon S3,Zipfile,下面是我如何生成ZIP并从服务器下载它,它在本地开发中运行良好 import zipfile 我的所有静态和媒体文件都在生产中上载到AWS。所以我改变了一点 # filepath becomes filepath = settings.MEDIA_ROOT + "/" + doc.file.name 但是当我尝试下载它时,它没有给我提供带有以下链接的[Errno 2]这样的文件或目录: https://bucket_name.s3.amazonaws.com/media/public/f
import zipfile
我的所有静态和媒体文件都在生产中上载到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\u 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)
AWS\u ACCESS\u KEY\u ID=config('AWS\u ACCESS\u KEY\u ID'))
AWS\u SECRET\u ACCESS\u KEY=config('AWS\u SECRET\u ACCESS\u KEY'))
AWS\存储\存储桶\名称='存储桶\名称'
AWS_S3_自定义_域='%s.S3.amazonaws.com'%AWS_存储\u存储桶\u名称
AWS_公共_媒体_位置='MEDIA/PUBLIC'
MEDIA\u ROOT=“https://%s/%s/”%(AWS\u S3\u自定义域、AWS\u公共\u媒体位置)
doc.file.path
给了我一个错误:“此后端不支持绝对路径”
,这就是为什么我改为MEDIA\u ROOT+doc.file.name
如何从AWS下载生成的zip文件?该文件存在于S3上,而不是本地文件系统上。调用这些
os.path.*
函数时,代码试图在本地文件系统上查找文件。它给你这个错误是因为你给它的S3URL路径不能映射到本地文件系统上的任何东西
为什么不允许S3通过简单地返回带有S3文件URL的重定向响应,而不是尝试读取文件并返回响应中的内容,将文件直接提供给最终用户的浏览器?好的,我理解!你能告诉我如何继续这样做吗?类似于
return HttpResponseRedirect(settings.MEDIA\u ROOT+“/”+doc.file.name)
注意,我正在尝试创建一个zip文件xzip=zipfile.zipfile(os.path.join(目录,“%s.zip”%filename),“w”)
OP会显示它。你在说这个吗。。。。因为返回HttpResponseRedirect只会生成文件,我错过了zip部分。在这种情况下,您需要首先使用AWS SDK将文件从S3复制到本地文件系统,然后压缩它们,然后提供压缩文件。很高兴您知道并尝试解释,请在您的答案中添加一个示例!
# filepath becomes
filepath = settings.MEDIA_ROOT + "/" + doc.file.name
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)