2016-11-17 68 views
0

我使用亞馬遜S3與.NET SDK,而低級別的API,他們提供的。我正在尋找關於如何嘗試重新啓動文件的多部分上傳的建議。這是一次重啓,因爲例如網絡連接斷開,或者存在內部異常,這會在文件的所有部分上傳到亞馬遜之前終止程序。亞馬遜S3 - 重新開始上傳失敗

  • 該文件是一個大約400MB的.MTS視頻文件。
  • 文件塊被上傳在5MB部分。

我使用他們的示例代碼中爲每個多上傳的文檔: -

for (int i = filePartCounts[0]; filePosition < contentLength; i++) 
{ 
    if (i == 10) 
    { 
     throw new Exception(); 
    } 

    UploadPartRequest uploadRequest = new UploadPartRequest 
    { 
     BucketName = "MyAwesomeBucket", 
     Key = "my-file-" + now + ".mts", 
     UploadId = initiateResponse.UploadId, 
     PartNumber = i, 
     PartSize = partSize, 
     FilePosition = filePosition, 
     FilePath = "C:\\path\\file.MTS", 
     Timeout = new TimeSpan(0, 15, 00) 
     }; 

     uploadResposes.Add(client.UploadPart(uploadRequest)); 
     File.WriteAllText(@"C:\\file\\data.txt", "my-file-" + now + ".mts/" + i + "/" + maxPartNumber); 

     filePosition += partSize; 

     Console.WriteLine("Successfull uploaded part " + i + " of " + maxPartNumber + " - Bytes " + (filePosition - partSize) + " bytes to " + filePosition + " bytes"); 
} 

由於這是一個原型,我保存記錄到一個文本文件,鍵名爲,上次成功部件號和部件號的最大數量,以便我可以在下次運行程序時讀取它,獲取密鑰名稱,並從第一個未上傳的塊開始。現在,我已經通過手動調用模擬程序示數: -

if (i == 10) 
{ 
    throw new Exception(); 
} 

所以73的程序退出後的第9塊。

我試圖獲得該項目從亞馬遜S3服務器回來時,面對的問題。我得到一個異常,當我打電話: -

client.GetObject(request); 

我想找回的文件與零件的其餘部分,然後再繼續上傳的部分。出於顯而易見的原因,我得到了'指定鍵不存在'的例外。因爲該文件尚未在Amazon S3上完成。

我的問題是,如果這也不行,我怎麼找回那種沒有成功上傳到Amazon S3的文件的部分,以再繼續添加零件10日起呢?

任何幫助大量的讚賞! 謝謝。 CompleteMultipartUpload被調用後

回答

2

的多部分上載將只出現在剷鬥中的對象。

http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html

在那之前,你有兩個選擇:

選擇1:你可以使用中止的AbortMultipartUpload現有的多部分上傳和重新開始。

http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadAbort.html

選項2:您可以使用ListParts獲得上傳部分的當前列表,然後上傳部分的其餘部分。

http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadListParts.html