2015-09-08 143 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。