C#代码到GZip并将字符串上传到Amazon S3
发布时间:2020-12-15 08:35:21 所属栏目:百科 来源:网络整理
导读:我目前使用以下代码从Amazon C#中检索和解压缩字符串数据: GetObjectRequest getObjectRequest = new GetObjectRequest().WithBucketName(bucketName).WithKey(key);using (S3Response getObjectResponse = client.GetObject(getObjectRequest)){ using (St
我目前使用以下代码从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,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)上发生异常 堆栈跟踪:
解决方法
在将其用作请求的输入之前,您需要刷新并关闭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,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作为输入,但我还没有尝试过. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |