• 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(9); // 0 - store only to 9 - means best compression
    
                            var entry = new ZipEntry(xmlFileName);
                            entry.DateTime = DateTime.Now;
                            zips.PutNextEntry(entry);
                            zips.Write(byteArray, 0, 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 = 2048;
                            byte[] data = new byte[2048];
                            while (true)
                            {
                                size = s.Read(data, 0, data.Length);
                                if (size > 0)
                                {
                                    sa.Write(data, 0, 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 > 0)
                            {
                                zip[0].Extract(msXmlStream);
                            }
                        }
    
                        return msXmlStream.ToArray();
                    }
                }
    
            }

    关于这两种生成zip,和解压缩zip, 我这里也提供源程序 点我下载

  • 相关阅读:
    jQuery实现button按钮提交表单
    jQuery实现button按钮提交表单
    egret清除缓存的方法
    jquery 路径动画贝塞尔动画
    html5自动横屏的方法
    vm虚拟机安装linux centos教程
    php pdo mysql存入转义
    格式工厂转化成mp4 avc格式 暴风影音不能播放的解决方法
    PHP过滤换行的方法
    css3 svg路径蒙版动画
  • 原文地址:https://www.cnblogs.com/mjxxsc/p/7878326.html
Copyright © 2020-2023  润新知