Я в настоящее время использую следующий код, чтобы получить и распаковать строковые данные Amazon C#:
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
}
}
}
}
Исключение, которое я получаю:
Не может получить доступ к закрытому Потоку.
Что я делаю неправильно?
Править:
Исключение происходит на закрывающей скобке использования (zip GZipStream
Отслеживание стека:
в System. IO.MemoryStream. Запишите (Байт [] буфер, смещение Int32, количество Int32)
в System. IO.Compression. DeflateStream. Расположите (расположение булевской переменной) в System. IO.Stream. Близко () в Системе. IO.Compression. GZipStream. Расположите (расположение булевской переменной) в System. IO.Stream. Близко ()
Вам необходимо очистить и закрыть 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 данными, но я еще никогда не пробовал этого.