2010-05-09 15 views
6

Tôi hiện đang sử dụng đoạn mã sau để lấy và giải nén dữ liệu chuỗi từ Amazon C#:C# để GZip và tải lên một chuỗi đến 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); 
     }  
    } 
} 

tôi muốn đảo ngược mã này để tôi có thể nén và upload chuỗi dữ liệu đến S3 mà không bị ghi vào đĩa. Tôi đã thử các sau đây, nhưng tôi nhận được một ngoại lệ:

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 
      } 
     } 
    } 
} 

Trường hợp ngoại lệ Tôi nhận được là:

Không thể truy cập một Stream khép kín.

Tôi đang làm gì sai?

EDIT:

Trường hợp ngoại lệ là xảy ra trên khung bế mạc sử dụng (GZipStream nén

Stack trace:

tại System.IO.MemoryStream.Write (Byte [] bộ đệm, độ lệch Int32, số Int32)
tại System.I O.Compression.DeflateStream.Dispose (Boolean xử lý) tại System.IO.Stream.Close() tại System.IO.Compression.GZipStream.Dispose (Boolean xử lý) tại System.IO.Stream.Close()

+0

Trường hợp ngoại lệ xảy ra? Bạn có thể thêm dấu vết ngăn xếp đầy đủ không? – dtb

+0

Cảm ơn. Ngoài ra tôi đăng chi tiết ngoại lệ – BigJoe714

Trả lời

11

Bạn cần phải tuôn ra và đóng GZipStream và đặt lại vị trí của các MemoryStream để 0 trước khi sử dụng nó như là đầu vào cho các yêu cầu:

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 
} 

nó cũng có thể là có thể sử dụng GZipStream như là đầu vào nếu trước tiên bạn điền vào MemoryStream với dữ liệu, nhưng tôi chưa bao giờ thử điều này.

+0

Cảm ơn! nó đã làm việc – BigJoe714

Các vấn đề liên quan