ZIP文件流压缩和解压
前面写了一篇文章 "ZIP文件压缩和解压", 介绍了" SharpZipLib.Zip " 的使用, 最近的项目中,在使用的过程中, 遇到一些问题.
比如, 现在从表里面取出数据, 生成xml字符串,然后生成zip文件流,上传到文件服务器.
以前的做法是 string=> 生成xml文件到本地=> 读取本地文件,生成zip文件=> 读取zip文件,存放到服务器. 这样做,本地会有一个xml,一个zip,用完还得删掉!!!
由于是挂到服务器IIS上的, 很多时候,对方并没有开写文件的权限,而且将文件写到本地,需要准备存储空间,好在我的xml,大小一般在10K以内, zip压缩后,就更小了.
几番波折, 找到了一种解决方案, 还是用 " SharpZipLib.Zip ", 本地不产生任何文件. 代码如下
/// <summary>
/// 将文本信息,写入zip压缩包
/// </summary>
/// <param name="xmldata">xml文本信息</param>
/// <param name="xmlFileName">xml文件名称,例如 data.xml</param>
/// <returns>返回zip压缩文件的字节数组</returns>
public static byte[] CreateZIPBytes(string xmldata, string xmlFileName)
{ try
{
byte[] byteArray = System.Text.Encoding.Default.GetBytes(xmldata); using (MemoryStream ms = new MemoryStream())
{
using (ZipOutputStream zips = new ZipOutputStream(ms))
{
zips.SetLevel(); // 0 - store only to 9 - means best compression var entry = new ZipEntry(xmlFileName);
entry.DateTime = DateTime.Now;
zips.PutNextEntry(entry);
zips.Write(byteArray, , byteArray.Length);
zips.Finish();
}
byte[] zipBytes = ms.ToArray(); //这里是一个zip压缩的文件流 return zipBytes;
} }
catch (Exception ex)
{
throw ex; } }
zip文件流解压
/// <summary>
/// 传入zip压缩的文件流字节, 得到解压后的第一个文件字节数组
/// </summary>
/// <param name="zipbyte">zip文件的文件字节数组</param>
/// <returns>解压后的第一个文件的文件字节数组</returns>
public static byte[] UnZIPByBytes(byte[] zipbyte)
{
byte[] xmldata = null;
using (ZipInputStream s = new ZipInputStream(new MemoryStream(zipbyte)))
{
ZipEntry theEntry = s.GetNextEntry();
if (theEntry != null)
{
Console.WriteLine("解压出来的文件名:" + theEntry.Name); using (MemoryStream sa = new MemoryStream())
{
int size = ;
byte[] data = new byte[];
while (true)
{
size = s.Read(data, , data.Length);
if (size > )
{
sa.Write(data, , size);
}
else
{
break;
}
}
xmldata = sa.ToArray();
}
}
}
return xmldata;
}
然后, 生成出来的zip文件流, 经过打包以后, 传递给另外一个Java的项目接口使用, 对方竟然解不出来这个zip的文件流, 顿时感觉, 一群草泥马奔腾.....
对方使用的是阿帕奇10年前的jar包, 我也不能让对方改包, 所以只能是我这边做调整, 我在网上找了几种其他产生zip的包的方式, 大多数都要产生文件,
然后我问对方, 你们以前跟.net做对接, 他们是怎么做的, 告知我用的是 "Ionic.Zip" 我还是第一次听说这个包, 于是又在网上找了点介绍,看了下. 简单花了点时间,
弄出一下代码, 这下对方可以正常解析了.
public class IonicZipHelper
{
/// <summary>
/// 创建zip的压缩文件流
/// </summary>
/// <param name="xmldata"></param>
/// <param name="xmlFileName"></param>
/// <returns></returns>
public static byte[] CreateZip(string xmldata, string xmlFileName)
{
byte[] xmlByte = Encoding.UTF8.GetBytes(xmldata); using (MemoryStream ms = new System.IO.MemoryStream())
{
using (ZipFile zip = new ZipFile())
{ zip.AddEntry(xmlFileName, xmlByte);
zip.Save(ms); }
return ms.ToArray();
}
} /// <summary>
/// 解压zip文件流, 得到zip压缩包内的第一个文件的文件流
/// </summary>
/// <param name="zipByte"></param>
/// <returns></returns>
public static byte[] UnZipByBytes(byte[] zipByte)
{
using (MemoryStream msXmlStream = new MemoryStream())
{
using (MemoryStream ms = new MemoryStream(zipByte))
{
using (ZipFile zip = ZipFile.Read(ms))
{
if (zip.Entries.Count > )
{
zip[].Extract(msXmlStream);
}
} return msXmlStream.ToArray();
}
} }
关于这两种生成zip,和解压缩zip, 我这里也提供源程序 点我下载
ZIP文件流压缩和解压的更多相关文章
- java对 zip文件的压缩和解压(ant解决中文乱码)
说明: 1.对于压缩的文件,当文件名称是中文时,若使用JDK API中自带的类(java.util.zip.ZipEntry; java.util.zip.ZipOutputStream;)进行压缩, ...
- C#文件或文件夹压缩和解压方法(通过ICSharpCode.SharpZipLib.dll)
我在网上收集一下文件的压缩和解压的方法,是通过ICSharpCode.SharpZipLib.dll 来实现的 一.介绍的目录 第一步:下载压缩和解压的 ICSharpCode.SharpZipLib ...
- java实现文件的压缩和解压
java实现文件的压缩和解压 代码压缩实现 package com.hjh.demo.zip; import java.io.BufferedInputStream; import java.io.F ...
- C#文件或文件夹压缩和解压
C#文件或文件夹压缩和解压方法有很多,本文通过使用ICSharpCode.SharpZipLib.dll来进行压缩解压 1.新建一个winform项目,选择项目右键 管理NuGet程序包,搜索ICSh ...
- linux下文件加密压缩和解压的方法
一.用tar命令 对文件加密压缩和解压 压缩:tar -zcf - filename |openssl des3 -salt -k password | dd of=filename.des3 此命 ...
- [Swift通天遁地]七、数据与安全-(9)文件的压缩和解压
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 用jdk1.6的pack200和unpack200,对jar文件进行压缩和解压 .pack.gz
用jdk1.6的pack200和unpack200,对jar文件进行压缩和解压 解压xxx.jar.pack.gz为xxx.jar:unpack200 -r xxx.jar.pack.gz xxx.j ...
- gz文件的压缩和解压
gz文件的压缩和解压 压缩: gzip filename 解压: gunzip filename.gz
- 【C#公共帮助类】WinRarHelper帮助类,实现文件或文件夹压缩和解压,实战干货
关于本文档的说明 本文档使用WinRAR方式来进行简单的压缩和解压动作,纯干货,实际项目这种压缩方式用的少一点,一般我会使用第三方的压缩dll来实现,就如同我上一个压缩类博客,压缩的是zip文件htt ...
随机推荐
- java:数据结构复习(三)链表队列
@TOC 和栈一样,队列也是表,但是使用队列的特点是先进先出. 队列模型 队列的基本操作是入队,它是在表的末端插入一个元素,和出队,它是删除在表开头的一个元素 graph LR A[<kbd&g ...
- CSS(九)元素隐藏和利弊
隐藏元素.无法点击,这之间有什么关系呢? 可以配合我写的 html 食用:https://github.com/dirstart/ScriptOJ/blob/master/OJ_CSS/4.css%E ...
- Mybatis学习笔记(六) —— 动态sql
通过mybatis提供的各种标签方法实现动态拼接sql. 需求:根据性别和名字查询用户 查询sql: SELECT id, username, birthday, sex, address FROM ...
- C语言文件I/O和标准I/O函数
读取/写入 相对于文件而言 输入/输出 相对于程序/内存而言 一切皆文件,键盘.显示屏也是文件,只不过是特殊的标准文件: 标准文件:标准输入.标准输出.标准错误:---->对应的文件指针:st ...
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_.Net Framework 部署目标
1.解决Windows性能不稳定: 2.降低Windows程序安装的复杂性: 3.解决Windows程序不安全性: 4.解决应用程序状态在硬盘上分散: 5.允许用户灵活地控制哪些东西能够安装,哪些东西 ...
- POJ3074 Sudoku 剪枝深(神?)搜
emm...挺秀的...挺神的? 每行,每列,每宫用一个二进制数表示选或没选的状态,刚开始设没选为1,然后更改状态的时候异或一下就好了: 这样可以通过lowbit取出每一个没有选过的数:(妙啊? 关于 ...
- poj1964最大子矩阵 (单调栈加枚举)
题目传送门 题目大意: 一个矩阵中,求F组成的矩阵的面积,(答案乘以三). 思路:n如果是小于100的,就可以通过前缀和,然后三重循环暴力找,和poj1050很像,但由于是1000,就不可以了,时间复 ...
- Helvetic Coding Contest 2016 online mirror A1
Description Tonight is brain dinner night and all zombies will gather together to scarf down some de ...
- django 自带的验证功能
django.contrib.auth提供了很多验证方法 authenticate(): 提供了用户认证,在自带的数据库表中验证用户名和密码,需要username和password两个关键字参数 如果 ...
- SQL 十分位
-- 十分位,这个算法不是很准确 select family_agreement_cnt -- 字段 ,dt -- 分区 ,rn -- 排序 ,cnt -- 总行数 ,percent2 -- 分位值 ...