2015-09-08 254 views
4

有没有办法在Amazon S3上连接小于5MB的小文件。 由于小文件,多部件上传不正常。Amazon S3连接小文件

这不是一个有效的解决方案来拉下所有这些文件并进行连接。

那么,有人可以告诉我一些API来做到这一点吗?

+1

这些文件是否已经在S3上?如果没有,你不能在上传之前连接(或压缩)吗? –

回答

7

Amazon S3不提供连接功能。它主要是一个对象存储服务。

您需要一些过程来下载对象,合并它们,然后再次上传它们。执行此操作的最有效方法是并行下载对象,以充分利用可用带宽。但是,编码更复杂。

我建议在“云中”进行处理以避免必须通过Internet下载对象。在上进行操作Amazon EC2或AWS Lambda会更高效,成本更低。

+5

旧评论,但这不完全正确。你可以有一个5MB的垃圾对象坐在S3上,并与它连接,其中第1部分= 5MB垃圾对象,第2部分=你想要连接的文件。继续为每个片段重复此操作,最后使用范围副本去除5MB垃圾。 – wwadge

+0

@wwadge哦!这是阴险和*非常*酷!使用[上传零件 - 复制](http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadUploadPartCopy.html)从多个文件复制数据,就好像它们是同一文件的一部分一样。整齐! –

0

编辑:没有看到5MB的要求。由于这个要求,这种方法将不起作用。

https://ruby.awsblog.com/post/Tx2JE2CXGQGQ6A4/Efficient-Amazon-S3-Object-Concatenation-Using-the-AWS-SDK-for-Ruby

虽然可以下载,并通过 的EC2实例中重新将数据上传到S3,更有效的办法是指示S3到 使用使一个内部复制在版本1.10.0中为Ruby引入了新的copy_part API操作 。

代码:

require 'rubygems' 
require 'aws-sdk' 

s3 = AWS::S3.new() 
mybucket = s3.buckets['my-multipart'] 

# First, let's start the Multipart Upload 
obj_aggregate = mybucket.objects['aggregate'].multipart_upload 

# Then we will copy into the Multipart Upload all of the objects in a certain S3 directory. 
mybucket.objects.with_prefix('parts/').each do |source_object| 

    # Skip the directory object 
    unless (source_object.key == 'parts/') 
    # Note that this section is thread-safe and could greatly benefit from parallel execution. 
    obj_aggregate.copy_part(source_object.bucket.name + '/' + source_object.key) 
    end 

end 

obj_completed = obj_aggregate.complete() 

# Generate a signed URL to enable a trusted browser to access the new object without authenticating. 
puts obj_completed.url_for(:read) 

限制(其中包括)

  • 随着最后一部分外,还有一个5 MB最小部件的尺寸。
  • 完成的分段上传对象限制为最大5 TB。