office转png解压程序

2016/7/27 16:07:50

   

    调用Office转png的接口API时,转换出来的图片会打包成 .zip文件包,用户需将文件包下载到本地,然后进行解压,才

能使用。

    疑问:图片压缩又解压,这样什么意义?同时用起来很不方便?

    针对以上的疑问,小编的总结如下:首先,Office转png,由于文件本身比较大,整个转化的过程会极大的消耗服务器

内存,当使用人数过多时,会出现转换速度过慢,或者转换不出来;其次,每次转换的zip文件包会定期进行清理,使用大

批的图片进行存储,没有意义;还有,下载压缩完的文件,占用内存小,方便处理。

    为了节省开发时间,用户在解压的时候,可以复制粘贴如下解压程序;

    下载方法:/// <summary>
        /// 将远程文件保存到本地服务器
        /// </summary>
        /// <param name="surl">下载文件的地址</param>
        /// <param name="dwonfile">保存本地地址</param>
        private bool StartDownload(string pathURL, string dwonfile)
        {
            bool b = false;
            WebClient client = new WebClient();
            Stream stream = client.OpenRead(pathURL);
            try
            {
                client.DownloadFile(pathURL, dwonfile);
                b = true;
            }
            catch (WebException exp)
            {
                //log.WriteLog("云转码下载错误:[" + pathURL + "]" + exp.Message);
            }
            finally
            {
                stream.Close();
            }
            return b;
        }
      解压方法:

 public bool OverZip(string filepath)
        {
            //是否为压缩包文件存在,压缩包直接解压
            if (File.Exists(filepath))
            {
                try
                {
                    string[] FilePathS = new string[2];
                    FilePathS[0] = filepath;  //待解压的文件
                    FilePathS[1] = filepath.Substring(0, filepath.LastIndexOf(".")) + "/";  //解压目标存放目录
                    UnZipClass.UnZip(FilePathS);
                }
                catch (Exception ex)
                {
                    return false;
                }
                //File.Delete(filepath);
            }
            return true;
        }
/// <summary>
    ///  解压类
    /// </summary>
    public class UnZipClass
    {
        /// <summary>
        /// 解压功能(解压压缩文件到指定目录)
        /// </summary>
        /// <param name="args">待解压的文件</param>
        /// <param name="args">指定解压目标目录</param>
        public static void UnZip(string[] args)
        {
            ZipInputStream s = new ZipInputStream(File.OpenRead(@args[0].Trim()));
            ZipEntry theEntry;

            string rootDir = ""; //根目录下的第一个子文件夹的名称
            string directoryName = Path.GetDirectoryName(@args[1].Trim());
            string path = @args[1].Trim();
            if (!Directory.Exists(@args[1].Trim()))
            {
                Directory.CreateDirectory(directoryName);
            }
            while ((theEntry = s.GetNextEntry()) != null)
            {
                rootDir = Path.GetDirectoryName(theEntry.Name); //得到根目录下的第一级子文件夹的名称
                if (rootDir.IndexOf("\\") >= 0)
                {
                    rootDir = rootDir.Substring(0, rootDir.IndexOf("\\") + 1);
                }
                string dir = Path.GetDirectoryName(theEntry.Name); //根目录下的第一级子文件夹的下的文件夹的名称
                string fileName = Path.GetFileName(theEntry.Name); //根目录下的文件名称
                if (dir != "" && fileName == "") //创建根目录下的子文件夹,不限制级别
                {
                    if (!Directory.Exists(@args[1].Trim() + dir))
                    {
                        path = @args[1].Trim()  + dir; //在指定的路径创建文件夹
                        Directory.CreateDirectory(path);
                    }
                }
                else if (dir == "" && fileName != "") //根目录下的文件
                {
                    path = @args[1].Trim();

                }
                else if (dir != "" && fileName != "") //根目录下的第一级子文件夹下的文件
                {
                    if (dir.IndexOf("\\") > 0) //指定文件保存的路径
                    {
                        path = @args[1].Trim() + dir;
                    }
                }

                if (dir == rootDir) //判断是不是需要保存在根目录下的文件
                {
                    path = @args[1].Trim() + rootDir;
                }
                if (fileName != String.Empty)
                {
                    FileStream streamWriter = File.Create(path +"\\"+ fileName);

                    int size = 2048;
                    byte[] data = new byte[2048];
                    while (true)
                    {
                        size = s.Read(data, 0, data.Length);
                        if (size > 0)
                        {
                            streamWriter.Write(data, 0, size);
                        }
                        else
                        {
                            break;
                        }
                    }
                    streamWriter.Close();
                }
            }
            s.Close();
        }
    }