python - 如何使用 Boto3 Python 在 S3 中创建 zipfile?

标签 python flask heroku amazon-s3 zip

我正在尝试从 S3 存储桶中子文件夹中的多个文件创建一个 zip 文件,然后将该 zip 文件保存在同一存储桶中的另一个子文件夹中。

在本地运行我的 Flask 应用程序时,我可以从我的 S3 子文件夹存储桶创建 zip 文件,但不能使用 Heroku,因为它不存储任何内容。

我正在查看这个示例,但它似乎过时了并且使用了本地文件。 https://www.botreetechnologies.com/blog/create-and-download-zip-file-in-django-via-amazon-s3

这是我正在使用的代码片段。

from flask import Response
import boto3, zipfile, os

AWS_ACCESS_KEY_ID = "some access key"
AWS_ACCESS_SECRET_ACCESS_KEY = "some secret key"
AWS_STORAGE_BUCKET_NAME = "some bucket"

aws_session = boto3.Session(aws_access_key_id = AWS_ACCESS_KEY_ID,
                   aws_secret_access_key = AWS_SECRET_ACCESS_KEY)

s3 = aws_session.resource("s3")

s3 = boto3.client("s3", region_name = "some region")
s3_resource = boto3.resource("s3")
blog_folder = "blog_1"

paginator = s3.get_paginator("list_objects")

file_list = [page for page in paginator.paginate(Bucket=AWS_STORAGE_BUCKET_NAME)\
            .search("Contents[?Size >`0`][]")
            if blog_folder in page["Key"]]



zf = zipfile.ZipFile(byte, "w")
zipped_files = []

zip_filename = "download_files.zip"

for key in file_list:

    file_name = key["Key"].split("/")[-1]

    my_bucket = s3_resource.Bucket(AWS_STORAGE_BUCKET_NAME)

    file_obj = my_bucket.Object(key["Key"]).get()


    zipped_files.append(file_obj["Body"].read())

知道如何解决这个问题吗?用户能够下载 zip 文件而不是单个文件要方便得多。 非常感谢任何帮助。

最佳答案

python 的内存中 zip 库非常适合这一点。这是我的一个项目中的一个示例:

import io
import zipfile

zip_buffer = io.BytesIO()
with zipfile.ZipFile(zip_buffer, "a", zipfile.ZIP_DEFLATED, False) as zipper:
    infile_object = s3.get_object(Bucket=bucket, Key=object_key) 
    infile_content = infile_object['Body'].read()
    zipper.writestr(file_name, infile_content)

s3.put_object(Bucket=bucket, Key=PREFIX + zip_name, Body=zip_buffer.getvalue())

关于python - 如何使用 Boto3 Python 在 S3 中创建 zipfile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62257753/

相关文章:

python - Flask 日志记录 - 调试设置

python - 无法使用 wtforms、append_entry() 和 FieldList(FormField()) 更改动态添加的表单字段的标签

ruby-on-rails - 在 heroku 上设置 WEB_CONCURRENCY 的公式是什么?

python - flask-sqlalchemy 表编辑未显示

ruby-on-rails - 如何在 heroku 上为 rails 应用程序设置 postgresql?

heroku - 使用 Anaconda 和 OpenCV 将 Docker 应用程序部署到 Heroku 时出现 "Could not find a version that satisfies the requirement cv2==1.0"

python - 树莓派 Python 错误

python - 为 matplotlib 散点图中的每个标记提供单独的 zorder 值

python - while循环不会在递归二分查找中停止

python - 如何在 Python 列表中找到第 1、2、3 个最高值