对于我的应用程序,我需要上传一个压缩的tif图像。需要注意的是,tif是从web服务下载到MemoryStream
的,我试图避免写入硬盘。压缩此MemoryStream
并将结果数据复制到另一个流(特别是HttpWebRequest
的请求流)而不将任何文件保存到磁盘的最佳方法是什么?
答案 0 :(得分:1)
你看过GZipStream了吗?这应该能够处理你的大多数问题。
请参阅:http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx
答案 1 :(得分:1)
以下是我在VB.NET应用程序中使用的内容......这在内存中都有效。
Imports System
Imports System.Collections.Generic
Imports System.IO.Compression
Imports System.IO
Imports System.Collections
Namespace Utilities
Class Compression
Public Shared Function Compress(ByVal data As Byte()) As Byte()
Dim ms As New MemoryStream()
Dim ds As New DeflateStream(ms, CompressionMode.Compress)
ds.Write(data, 0, data.Length)
ds.Flush()
ds.Close()
Return ms.ToArray()
End Function
Public Shared Function Decompress(ByVal data() As Byte) As Byte()
Try
'Copy the data (compressed) into ms.
Using ms As New MemoryStream(data)
Using zipStream As Stream = New DeflateStream(ms, CompressionMode.Decompress, True)
'Decompressing using data stored in ms.
'zipStream = New DeflateStream(ms, CompressionMode.Decompress, True)
'Used to store the decompressed data.
Dim dc_data As Byte()
'The decompressed data is stored in zipStream;
' extract them out into a byte array.
dc_data = RetrieveBytesFromStream(zipStream, data.Length)
Return dc_data
End Using
End Using
Catch ex As Exception
MsgBox(ex.ToString)
Return Nothing
End Try
End Function
Public Shared Function RetrieveBytesFromStream( _
ByVal stream As Stream, ByVal bytesblock As Integer) As Byte()
'Retrieve the bytes from a stream object.
Dim data() As Byte
Dim totalCount As Integer = 0
Try
While True
'Progressively increase the size of the data byte array.
ReDim Preserve data(totalCount + bytesblock)
Dim bytesRead As Integer = stream.Read(data, totalCount, bytesblock)
If bytesRead = 0 Then
Exit While
End If
totalCount += bytesRead
End While
'Make sure the byte array contains exactly the number
'of bytes extracted.
ReDim Preserve data(totalCount - 1)
Return data
Catch ex As Exception
MsgBox(ex.ToString)
Return Nothing
End Try
End Function
End Class
End Namespace
答案 2 :(得分:0)
我也在使用Memory流,这就是我正在做的压缩/压缩它并通过n / w发送它。
MemoryStream st = new MemoryStream();
GZipStream zs = new GZipStream(st, CompressionMode.Compress);
zs.Write(dataSetResp.Response, 0, dataSetResp.Response.Length);
byte[] tmp = st.GetBuffer();
zs.Close();