2013-10-28 5 views
1

Я пытаюсь загрузить файл с помощью AWS, когда я устанавливаю размер детали как 5 МБ, код работает нормально, но когда я пытаюсь изменить размер детали до 1 МБ, это дает мне исключение: Код являетсяошибка множественной загрузки в C#

  string strusername = "user1";  
      strlocalpath = "C:\\file1.zip";  
      string BUCKET_NAME = "bucket1"; 
      string filename = "file1.zip" 
      string keypath = strusername + "/" + filename; 
      string keyName = "123"; 
      string filePath = strlocalpath; 
      // List to store upload part responses. 
      List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>(); 

      // 1. Initialize. 
      InitiateMultipartUploadRequest initRequest = 
       new InitiateMultipartUploadRequest() 
       .WithBucketName(BUCKET_NAME) 
       .WithKey(keyName); 

      InitiateMultipartUploadResponse initResponse = 
       s3Client.InitiateMultipartUpload(initRequest); 

      // 2. Upload Parts. 
      long contentLength = new FileInfo(filePath).Length; 
      //Set Part size 
      long partSize = 1*1024*1024; // 5 MB 

      try 
      { 
       long filePosition = 0; 
       for (int i = 1; filePosition < contentLength; i++) 
       { 

        if (filePosition + partSize > contentLength) 
        { 
         partSize = contentLength - filePosition; 
        } 
        // Create request to upload a part. 
        UploadPartRequest uploadRequest = new UploadPartRequest() 
         .WithBucketName(BUCKET_NAME) 
         .WithKey(keyName) 
         .WithUploadId(initResponse.UploadId) 
         .WithPartNumber(i) 
         .WithPartSize(partSize) 
         .WithFilePosition(filePosition) 
         .WithFilePath(filePath) 
         .WithTimeout(60*60*60); 

        // Upload part and add response to our list. 
        uploadResponses.Add(s3Client.UploadPart(uploadRequest)); 

        filePosition += partSize; 



        Console.WriteLine("\nTotal uploaded size = " + filePosition.ToString()); 
       } 

       // Step 3: complete. 
       CompleteMultipartUploadRequest compRequest = 
        new CompleteMultipartUploadRequest() 
        .WithBucketName(BUCKET_NAME) 
        .WithKey(keyName) 
        .WithUploadId(initResponse.UploadId) 
        .WithPartETags(uploadResponses); 

       CompleteMultipartUploadResponse completeUploadResponse = 
        s3Client.CompleteMultipartUpload(compRequest); 

      } 
      catch (Exception exception) 
      { 
       Console.WriteLine("Exception occurred: {0}", exception.Message); 
       s3Client.AbortMultipartUpload(new AbortMultipartUploadRequest() 
        .WithBucketName(BUCKET_NAME) 
        .WithKey(keyName) 
        .WithUploadId(initResponse.UploadId)); 
      } 

исключение:

<Error> 
<Code>EntityTooSmall</Code> 
<Message>Your proposed upload is smaller than the minimum allowed size</Message> 
<ETag>d9c00192bcf6bf7412814a8fe0422b0c</ETag> 
<MinSizeAllowed>5242880</MinSizeAllowed> 
<ProposedSize>1048576</ProposedSize> 
<RequestId>PBG04E031C012F34</RequestId> 
<HostId>VEjvpkjuk89yS4xW6Bl/+NPpb3yxvbbe7ijjPmTrlXc7hnjj89kjkm</HostId> 
<PartNumber>1</PartNumber></Error> 

Я хочу, чтобы загрузить файл на куски 1 МБ или 2 МБ это можно сделать?

Благодаря

+0

поэтому в основном он не будет работать для размера детали <5MB – kunal

ответ

2

Минимальный размер части для загрузки S3 составляет 5 МБ.

http://docs.aws.amazon.com/AmazonS3/latest/dev/qfacts.html

Очевидно, что последняя часть, как правило, меньше, и это хорошо.

Побочным эффектом того факта, что «последняя часть» может быть меньше, является то, что если у вас есть, например, файл 500 КБ, и вы отправляете его как многостраничную загрузку, «первая часть» также является «первой частью», последней части ", и это все еще работает, потому что оно удовлетворяет правилу, что« последняя часть »может быть меньше 5 МБ, но вам все же приходится явно использовать размер детали не менее 5 МБ.

Я обнаружил это при тестировании многофайловой загрузки, которая по умолчанию равна 64 МБ. Он по-прежнему отлично работает на небольших файлах, которые получают multipart-uploaded как единую «часть», которая составляет менее 5 МБ.

2

Похоже, вы получили ваш проклейки неправильно.

S3 Документация: Upload Part

Каждая часть должна быть не менее 5 МБ в размере, за исключением последней части. Там не ограничивает размер последней части вашей многостраничной загрузки.

Нет, вы не можете указать, чтобы детали были меньше 5 МБ. При выполнении multipart он автоматически разрешает последнюю часть, считая, что последняя часть не является первой/единственной частью, составляет менее 5 МБ.


Glacier Документация: Amazon's Initiate MultiPart Upload documentation состояния:

При инициации многослойную загрузку, вы указываете размер детали в числа байтов. Размер партии должен быть мегабайтом (1024 КБ), умноженным на на мощность 2 - например, 1048576 (1 МБ), 2097152 (2 МБ), 4194304 (4 МБ), 8388608 (8 МБ) и т. Д. , Минимально допустимый размер детали: 1 МБ, а максимальный - 4 ГБ.

Ваш код имеет long partSize = 1*1024*1024, который 1048576 который 1 MB из вышесказанного, не 5МБ как ваш комментарий государств.

И ofnote для дальнейшего использования или же вопроса, с одной и той же ссылке:

Каждая часть вы загружаете с помощью этой загрузки ID, за исключением последнего, должны иметь одинаковый размер. Последний может быть того же размера или меньше. Например, для вы хотите загрузить файл размером 16,2 МБ. Если вы инициируете многостраничную загрузку с размером детали 4 МБ, вы будете загружать четыре частей по 4 МБ каждая и одну часть 0,2 МБ.

+0

Собственно, это ссылка на документацию о леднике, а не на S3. –

+0

@ Michael-sqlbot Упомянутый ответ S3 с документацией. – bland

+0

Да, это не работает ни на что, кроме 5 МБ, я попытался установить размер как 1 МБ и 2 МБ .. но все равно не повезло – kunal

0

Существует простое правило: если ваш файл меньше 5 МБ, загрузите его в одну часть.

Смежные вопросы