您好,我最近必须为我的应用程序执行此操作 - 通过用户可以下载的 url 链接提供 zip 格式的文件包。
简而言之,首先使用 BytesIO 方法创建一个对象,然后使用 ZipFile 方法通过迭代所有 s3 对象来写入该对象,然后对该 zip 对象使用 put 方法并为其创建一个预置 url。
我使用的代码如下所示:
首先调用这个函数获取zip对象,ObjectKeys就是你需要放入zip文件的s3对象。
def zipResults(bucketName, ObjectKeys):
buffer = BytesIO()
with zipfile.ZipFile(buffer, 'w', compression=zipfile.ZIP_DEFLATED) as zip_file:
for ObjectKey in ObjectKeys:
objectContent = S3Helper().readFromS3(bucketName, ObjectKey)
fileName = os.path.basename(ObjectKey)
zip_file.writestr(fileName, objectContent)
buffer.seek(0)
return buffer
然后调用这个函数,key就是你给你的zip对象的key:
def uploadObject(bucketName, body, key):
s3client = AwsHelper().getClient("s3")
try:
response = s3client.put_object(
Bucket=bucketName,
Body=body,
Key=key
)
except ClientError as e:
logging.error(e)
return None
return response
当然,你需要 io、zipfile 和 boto3 模块。