Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 允许用户下载AWS上生成的zip文件_Python_Django_Amazon Web Services_Amazon S3_Zipfile - Fatal编程技术网

Python 允许用户下载AWS上生成的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

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

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)