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

时间:2018-07-07 13:40:29

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

这是我生成ZIP并将其从服务器下载的方法,在本地开发中效果很好。

+------+-------+---+------+----+----+
|number|   word| ID|  Name|col1|col2|
+------+-------+---+------+----+----+
|     1|    bat|101| Naman|   2|   4|
|     1|    bat|101| Naman|   3|   5|
|     1|    bat|101| Naman|   8|  10|
|     2|    abc|102|Bhagat|   3|   9|
|     2|    abc|102|Bhagat|   8|   8|
|     2|    abc|102|Bhagat|   7|  11|
|     3|   abcd|103|Anchal|   1|   3|
|     3|   abcd|103|Anchal|   9|   6|
|     3|   abcd|103|Anchal|   2|  12|
|     4|  abcde|104|   Dev|   8|   4|
|     4|  abcde|104|   Dev|   6|   5|
|     4|  abcde|104|   Dev|   9|  13|
|     3| abcdef|105| PArul|   2|   7|
|     3| abcdef|105| PArul|   7|   3|
|     3| abcdef|105| PArul|   8|  14|
|     1|abcdefg|106| Vipul|   3|   8|
|     1|abcdefg|106| Vipul|   4|   4|
|     1|abcdefg|106| Vipul|   2|  15|
+------+-------+---+------+----+----+
doc = get_object_or_404(Document,id=id_obj)
import zipfile

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

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

但是当我尝试下载它时,它为我提供了 # 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'

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

1 个答案:

答案 0 :(得分:2)

该文件存在于S3上,而不是本地文件系统上。当您调用这些os.path.*函数时,代码将尝试在本地文件系统上查找文件。之所以会出现此错误,是因为您提供的S3 URL无法将路径映射到本地文件系统上的任何内容。

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