C# 代码到 GZip 并将字符串上传到 Amazon S3

标签 c# amazon-s3 amazon-web-services

我目前使用以下代码从 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
            }
        }
    }
}

我得到的异常是:

Cannot access a closed Stream.

我做错了什么?

编辑:

异常发生在using (GZipStream zip

堆栈跟踪:

at System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.Compression.DeflateStream.Dispose(Boolean disposing) at System.IO.Stream.Close() at System.IO.Compression.GZipStream.Dispose(Boolean disposing) at System.IO.Stream.Close()

最佳答案

在将其用作请求的输入之前,您需要刷新并关闭 GZipStream 并将 MemoryStream 的 Position 重置为 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 作为输入,但我从未尝试过。

关于C# 代码到 GZip 并将字符串上传到 Amazon S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2798467/

相关文章:

c# - Entity Framework 将日期时间转换为字符串

spring - AmazonS3 连接管理

python - 如何使用 boto3 将 S3 中的单个 Parquet 文件读入 Pandas 数据帧?

amazon-web-services - Cloudformation 等待同一堆栈中的另一个资源创建

java - 使用大量连接时 Kinesis 出现错误

c# - t-sql 中模仿 int.ToString ("D4"的高效算法);

c# - 带键的 LINQ groupby 语句

c# - GroupCollection 上无法访问的可枚举扩展方法

node.js - Heroku(Node 应用程序)中的临时文件会发生什么情况

amazon-web-services - AWS CloudWatch 本地时间