python - 如何使用 Boto3 Python 在 S3 中创建 zipfile?
问题描述
我正在尝试从 S3 存储桶中的子文件夹中的多个文件创建一个 zipfile,然后将该 zipfile 保存在同一存储桶中的另一个子文件夹中。
在本地运行我的烧瓶应用程序时,我可以从我的 S3 子文件夹存储桶创建 zipfile,但不能使用 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 - 在 Python 中使用 daff 包比较 2 个 CSV 文件
- javascript - 未捕获的不变违规:超出最大更新深度
- mysql - 如何在mysql中使用json函数按顺序插入键值对
- azure - 应用服务计划中的所有应用服务是否分摊相同的费用?
- python - 根据产品购买找到相似用户后在 python 中进行交叉销售
- reactjs - ReactJs无法从FETCH获取对象的值
- regex - 正则表达式引用捕获的组
- php - 如何在单击时查看登录表单输入的控制台输出?
- typescript - “typeof firebase”类型不存在属性“default”。错误
- vuetify.js - 如何在 vuetify 输入字段中调用 click:prepend 事件或 click:append 事件