2011-06-06 115 views
1

我想压缩一个内存流到另一个内存流,所以我可以上传到其余的API。 image是包含tif图像的初始内存流。GZipStream不压缩?

WebRequest request = CreateWebRequest(...); 
request.ContentType = "application/zip"; 
MemoryStream zip = new MemoryStream(); 
GZipStream zipper = new GZipStream(zip, CompressionMode.Compress); 
image.CopyTo(zipper); 
zipper.Flush(); 
request.ContentLength = zip.Length; // zip.Length is returning 0 
Stream reqStream = request.GetRequestStream(); 
zip.CopyTo(reqStream); 
request.GetResponse().Close(); 
zip.Close(); 

让我明白了,什么我写信给GZipStream将被压缩并写入任何数据流被传递到它的构造函数。当我将图像流复制到拉链时,它看起来没有任何实际复制(图像是200 + MB)。这是我第一次使用GZipStream的经验,所以很可能我错过了一些东西,任何建议,不胜感激。

编辑: 是我应该注意的是对我的一个问题,在上面的代码,image的位置是在流的尽头......因此,当我打电话image.CopyTo(zipper);什么也没有因位置复制。

+0

只是注意:如果您的TIFF格式已经被压缩了你不会得到非常可观的成绩(大部分是,我认为)。 – Cameron 2011-06-06 16:45:13

+0

这些是未压缩的GeoTiffs。另外,我上传这些图片的REST API要求上传为zip。 – 2011-06-06 16:46:30

回答

3

[编辑:对GZipStream和它的构造ARGS删除不正确的信息,并与真正答案:)更新]

您复制到拉链后,您需要转移的位置MemoryStream的回零,如拉链写入存储流的处理进入它的“光标”以及流读取:

WebRequest request = CreateWebRequest(...); 
request.ContentType = "application/zip"; 
MemoryStream zip = new MemoryStream(); 
GZipStream zipper = new GZipStream(zip, CompressionMode.Compress); 
image.CopyTo(zipper); 
zipper.Flush(); 
zip.Position = 0; // reset the zip position as this will have advanced when written to. 
... 

另一个要注意的是,GZipStream处于不可搜索,那么调用.Length将抛出异常。

+0

+1,因为它解释了GZipStream不可搜索,但MSDN示例在创建后(而不是基础流)将数据添加到GZip流*中。 OP没有误解 – Cameron 2011-06-06 16:53:06

+0

zipper.CopyTo(reqStream)引发异常。拉链不能被读取。 – 2011-06-06 16:55:53

+0

多次阅读kip的链接MSDN文章后,我越看越您的示例......我认为您误解了GZipStream越多。 – 2011-06-06 17:00:59

0
+0

除了using语句之外,我没有看到示例和我正在做什么之间的区别。我打算在我开始工作时添加使用语句,直到那时我不希望他们对什么范围内的内容造成破坏。 – 2011-06-06 16:51:05

+0

调用'Flush()'有什么问题?这似乎是完全合法的 – Cameron 2011-06-06 16:51:47

0

我对C#及其库文件一无所知,但我会尝试首先使用Close而不是(或之后)Flush

(Java的GZipOutputStream有它冲不下去了,直到Java 7中相同的问题)

+0

看来Close()的确是问题所在! zipper.Close()对我来说是缺少的,我相信它对于原始问题是缺少的。看到这个答案:http://stackoverflow.com/questions/6334463/gzipstream-compression-problem-lost-byte – 2013-09-09 06:46:23

相关问题