我有一堆文件在亚马逊s3桶中,我想压缩这些文件和下载获得的内容通过S3网址使用Java Spring。
发布于 2017-04-07 23:11:54
S3不是文件服务器,也不提供操作系统文件服务,例如数据操作。
如果有很多“巨型”文件,你最好的选择是
将其重新上传回S3存储桶
是的,您可以使用AWS lambda来做同样的事情,但是lambda被限制在900秒(15分钟)执行超时(因此,建议分配更多的RAM来提升lambda的执行性能)
S3到本地EC2实例和etc服务的流量是免费的。
如果您的主要目的只是使用EC2/etc服务读取同一AWS区域内的这些文件,那么您不需要这个额外的步骤。直接访问文件即可。
(更新):正如@Robert Reiz所提到的,现在您也可以使用AWS Fargate来完成此工作。
注意:
建议使用AWS API访问和共享文件。如果您打算公开共享该文件,则必须认真考虑安全问题并施加下载限制。亚马逊网络服务到互联网的流量从来都不便宜。
发布于 2018-09-11 07:06:04
如果您需要S3压缩格式的单个文件(对象),那么可以通过一种间接的方式来实现。您可以定义一个指向S3存储桶的CloudFront端点,然后让CloudFront在输出时压缩内容:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html
发布于 2020-09-18 12:23:47
嗨,我最近不得不为我的应用程序做这件事--通过一个用户可以下载的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对象提供的键:
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模块。
https://stackoverflow.com/questions/43275575
复制相似问题