2010-05-09 2 views
6

В настоящее время я использую следующий код для извлечения и распаковывать строки данных из Amazon C#:C# код для GZip и загрузить строку в Amazon S3

GetObjectRequest getObjectRequest = new GetObjectRequest().WithBucketName(bucketName).WithKey(key); 

using (S3Response getObjectResponse = client.GetObject(getObjectRequest)) 
{  
    using (Stream s = getObjectResponse.ResponseStream) 
    { 
     using (GZipStream gzipStream = new GZipStream(s, CompressionMode.Decompress)) 
     { 
      StreamReader Reader = new StreamReader(gzipStream, Encoding.Default);  
      string Html = Reader.ReadToEnd(); 
      parseFile(Html); 
     }  
    } 
} 

Я хочу обратить этот код так, что я могу сжать и загрузить строковые данные на S3 без записи на диск. Я попытался следующие, но я получаю исключение:

using (AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(AWSAccessKeyID, AWSSecretAccessKeyID)) 
{ 
    string awsPath = AWSS3PrefixPath + "/" + keyName+ ".htm.gz"; 

    byte[] buffer = Encoding.UTF8.GetBytes(content); 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress)) 
     { 
      zip.Write(buffer, 0, buffer.Length); 

      PutObjectRequest request = new PutObjectRequest(); 
      request.InputStream = ms; 
      request.Key = awsPath; 
      request.BucketName = AWSS3BuckenName; 

      using (S3Response putResponse = client.PutObject(request)) 
      { 
       //process response 
      } 
     } 
    } 
} 

Исключение я получаю:

Не удается получить доступ к закрытой Stream.

Что я делаю неправильно?

РЕДАКТИРОВАТЬ:

Исключение встречающийся на закрывающей скобки используя (GZipStream почтовый

Стек трассировки:

на System.IO.MemoryStream.Write (Байт [] буфер, смещение Int32, количество Int32)
по адресу System.I O.Compression.DeflateStream.Dispose (Boolean утилизации) при System.IO.Stream.Close() в System.IO.Compression.GZipStream.Dispose (булево утилизации) при System.IO.Stream.Close()

+0

Где происходит исключение? Можете ли вы добавить полную трассировку стека? – dtb

+0

Спасибо. Также я разместил исключение подробно – BigJoe714

ответ

11

Вам нужно промыть и закрыть GZipStream и сбросить установки в MemoryStream 0, прежде чем использовать его в качестве входных данных для запроса:

MemoryStream ms = new MemoryStream(); 

using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true)) 
{ 
    byte[] buffer = Encoding.UTF8.GetBytes(content); 
    zip.Write(buffer, 0, buffer.Length); 
    zip.Flush(); 
} 

ms.Position = 0; 

PutObjectRequest request = new PutObjectRequest(); 
request.InputStream = ms; 
request.Key = AWSS3PrefixPath + "/" + keyName+ ".htm.gz"; 
request.BucketName = AWSS3BuckenName; 

using (AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(
          AWSAccessKeyID, AWSSecretAccessKeyID)) 
using (S3Response putResponse = client.PutObject(request)) 
{ 
    //process response 
} 

Это также может быть возможным использовать GZipStream в качестве входных данных если вы сначала заполняете MemoryStream данными, но я еще не пробовал это.

+0

Спасибо! это сработало – BigJoe714

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