2013-02-27 1 views
4

Доброе утро, у меня есть настольное приложение, которое загружает файлы в службу WCF, а затем служба WCF загружается в Amazon S3.C# загрузка в реальном времени от клиента к серверу до amazon s3

Это мой метод WCF, который получает файл и загружает его на S3.

public void UploadFile(RemoteFileInfo request) 
     { 
      config = new AmazonS3Config(); 
      config.CommunicationProtocol = Protocol.HTTP; 
      accessKeyID = "XXXXXXX"; 
      secretAccessKeyID = "YYYYYYYY"; 
      client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKeyID, secretAccessKeyID, config); 

      int chunkSize = 2048; 
      byte[] buffer = new byte[chunkSize]; 

      using (System.IO.MemoryStream writeStream = new System.IO.MemoryStream()) 
      { 
       do 
       { 
        // read bytes from input stream 
        int bytesRead = request.FileByteStream.Read(buffer, 0, chunkSize); 
        if (bytesRead == 0) break; 

        // simulates slow connection 
        System.Threading.Thread.Sleep(3); 

        // write bytes to output stream 
        writeStream.Write(buffer, 0, bytesRead); 
       } while (true); 

       // report end 
       Console.WriteLine("Done!"); 

       // start the uploading to S3 
       PutObjectRequest fileRequest = new PutObjectRequest(); 
       fileRequest.WithInputStream(writeStream); 
       fileRequest.Key = "testfile.pdf"; 
       fileRequest.WithBucketName("tempbucket"); 
       fileRequest.CannedACL = S3CannedACL.Private; 
       fileRequest.StorageClass = S3StorageClass.Standard; 
       client.PutObject(fileRequest); 

       writeStream.Close(); 
      } 

     } 

На моем клиенте я получаю прогресс в реальном времени, когда загрузить файл в службы WCF, но когда я получаю 100% полная это не значит, что файл уже загружен в S3, так что я бы хотел бы знать, если его можно быть загрузить файл на S3, а Im записи потока (внутри с помощью

(System.IO.MemoryStream writeStream = new System.IO.MemoryStream()) 
      { 

возможно ли это? Любое руководство о том, как это сделать?

Цените заранее.

+0

К сожалению, ваш вопрос немного неясен (по крайней мере, для меня). Как ваш клиент демонстрирует прогресс в реальном времени? –

+0

У WCF есть функция для этого. VAAA

ответ

0

Вы можете использовать InputStream свойство PutObjectRequest

public void UploadFile(RemoteFileInfo request) 
{ 
    config = new AmazonS3Config(); 
    config.CommunicationProtocol = Protocol.HTTP; 
    accessKeyID = "XXXXXXX"; 
    secretAccessKeyID = "YYYYYYYY"; 
    client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKeyID,secretAccessKeyID,config); 

    int chunkSize = 2048; 
    byte[] buffer = new byte[chunkSize]; 

    PutObjectRequest fileRequest = new PutObjectRequest(); 

    fileRequest.Key = "testfile.pdf"; 
    fileRequest.WithBucketName("tempbucket"); 
    fileRequest.CannedACL = S3CannedACL.Private; 
    fileRequest.StorageClass = S3StorageClass.Standard; 

    using (fileRequest.InputStream = new System.IO.MemoryStream()) 
    { 
     do 
     { 
     // read bytes from input stream 
     int bytesRead = request.FileByteStream.Read(buffer, 0, chunkSize); 
     if (bytesRead == 0) break; 

     // simulates slow connection 
     System.Threading.Thread.Sleep(3); 

     // write bytes to output stream 
     fileRequest.InputStream.Write(buffer, 0, bytesRead); 
     } while (true); 

     // report end 
     Console.WriteLine("Done!"); 

     client.PutObject(fileRequest); 

    } 
} 
+0

Это работает, но по-прежнему имеет ту же проблему. Клиент знает, что файл уже был загружен на сервер, но когда вы вызываете client.PutObject (fileRequest), потому что он находится за пределами do, а затем должен ждать, пока сервер не загрузит этот поток на S3. – VAAA

+0

Сделайте это Async .. http://docs.aws.amazon.com/AWSSdkDocsNET/latest/DeveloperGuide/sdk-net-async-api.html – 2GDev

+1

Я думаю, получится тот же результат. Я должен начать загрузку внутри do while ... Я нашел это: http://stackoverflow.com/questions/13604916/s3-multi-part-upload-exception, используя Multiplart upload – VAAA

0

Я рекомендовал бы загрузить файл в WCF, как куски вместо потока. Я сделал это, и все работает отлично. также вам нужно вернуть сообщение фактических байтов, записанных на амазонку позже, вы можете увеличить индикатор выполнения на основе этого. Я знаю, это заставит вас написать цикл while в клиентском приложении, но это поможет вам показать прогресс с 100% точностью для больших файлов. Ваша функция WCF должна принять такой параметр, как эти

[DataContract] 
class RemoteFileInfo 
{ 
    [DataMember] 
    Byte[] myChunk; 
    [DataMember] 
    long myOffset; 
    // other stuff you think you need to be sent each time. 

} 
+0

Как я могу отправить куски вместо потока? Но поддерживает ли Amazon S3 загрузку байтов блока? – VAAA

+0

Он не связан с Amazon S3, используя класс WCF RemoteFileInfo удаляет элемент данных потока и добавляет другой элемент данных, который должен быть массивом байтов. вам также нужен другой элемент данных для смещения. –

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