如何在Amazon s3 Bucket中压缩文件并获取其URL

时间:2017-04-07 10:17:45

标签: java spring amazon-web-services amazon-s3

我在Amazon s3存储桶中有一堆文件,我想压缩这些文件并下载使用Java Spring通过S3 URL获取内容。

3 个答案:

答案 0 :(得分:12)

S3不是文件服务器,也不提供操作系统文件服务,例如数据操作。

如果有很多"巨大"文件,你最好的选择是

  1. 启动一个简单的EC2实例
  2. 将所有这些文件下载到EC2实例,压缩它们,然后将其重新上传回具有新对象名称的S3存储桶
  3. 是的,您可以使用AWS lambda执行相同的操作,但lambda限制为900秒(15分钟)执行超时(因此建议分配更多RAM以提高lambda执行性能)

    从S3到本地EC2实例和等服务的流量是免费的。

    如果您的主要目的是使用EC2 / etc服务读取同一AWS区域内的那些文件,那么您就不需要这个额外的步骤。只需直接访问该文件即可。

    注意:

    建议使用AWS API访问和共享文件。如果您打算公开共享该文件,则必须认真研究安全问题并实施下载限制。 AWS流向互联网并不便宜。

答案 1 :(得分:1)

如果需要在S3中压缩单个文件(对象),则可以以一种绕行方式进行。您可以定义指向S3存储桶的CloudFront端点,然后让CloudFront在出站时压缩内容:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html

答案 2 :(得分:-1)

嗨,我最近必须对我的应用程序执行此操作-通过用户可以下载的url链接提供zip格式的文件包。

简而言之,首先使用BytesIO方法创建一个对象,然后使用ZipFile方法通过迭代所有s3对象来写入该对象,然后对该zip对象使用put方法并为其创建一个预定的url。 >

我使用的代码如下:

首先,调用此函数以获取zip对象,ObjectKeys是需要放入zip文件中的s3对象。

@

然后调用此函数,key是您赋予zip对象的密钥:


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

当然,您需要io,zipfile和boto3模块。