C#编码到GZip并将字符串上传到amazons3

C#编码到GZip并将字符串上传到amazons3,c#,amazon-s3,amazon-web-services,C#,Amazon S3,Amazon Web Services,我目前使用以下代码从Amazon C#检索和解压缩字符串数据: 我想反转这段代码,这样我就可以压缩字符串数据并将其上传到S3,而无需写入磁盘。我尝试了以下操作,但遇到异常: using (AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(AWSAccessKeyID, AWSSecretAccessKeyID)) { string awsPath = AWSS3PrefixPath + "/" + keyName

我目前使用以下代码从Amazon C#检索和解压缩字符串数据:

我想反转这段代码,这样我就可以压缩字符串数据并将其上传到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
            }
        }
    }
}
我得到的例外是:

无法访问已关闭的流

我做错了什么

编辑:

使用(GZipStream zip)在的结束括号中出现异常

堆栈跟踪:

在 System.IO.MemoryStream.Write(字节[]) 缓冲区、Int32偏移量、Int32计数)
在 System.IO.Compression.DeflateStream.Dispose(布尔值 (处理)在 System.IO.Stream.Close()位于 System.IO.Compression.GZipStream.Dispose(布尔值 (处理)在 System.IO.Stream.Close()


在将MemoryStream用作请求的输入之前,需要刷新并关闭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
}

如果您首先用数据填充MemoryStream,也可以使用GZipStream作为输入,但我从未尝试过这种方法。

异常发生在哪里?您可以添加完整的堆栈跟踪吗?谢谢。另外,我发布了异常详细信息zip.Flush()应该是不必要的。
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
}