Разрешить пользователю загружать zip-файл, созданный на AWS

Вот как я делаю, чтобы создавать 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-файла?

python,django,amazon-web-services,amazon-s3,zipfile,

1

Ответов: 1


2

Файл существует на S3, а не в локальной файловой системе. Когда вы вызываете эти os.path.*функции, код пытается найти файл в локальной файловой системе. Это дает вам эту ошибку, потому что этот URL-адрес S3, который вы передаете ему в качестве пути, не может быть сопоставлен ни с чем в локальной файловой системе.

Почему бы вам не позволить S3 обслуживать файл непосредственно в браузере конечного пользователя, просто вернув ответ перенаправления с URL-адресом файла S3 вместо того, чтобы пытаться прочитать файл и вернуть содержимое в ответ?

Python, Django, амазонки-веб-сервисы, амазонка-s3, ZipFile,
Похожие вопросы