20200728-直接提取压缩包里的文件

一 使用背景:

通过Http 请求下载一个压缩的文件到服务器内存中(重点:不用保存到本地),然后通过代码直接提取压缩包的文件

二 实现思路:(注:需要提前安装 ICSharpCode.SharpZipLib.dll)

1 通过Http请求下载压缩文件到服务器的内存中

2 读取内存中压缩的包的流(注意先将:Stream 转换成MemoryStream)

3 通过ICSharpCode.SharpZipLib.Zip.dll的ZipFile方法将压缩包的MemoryStream 注入

4 通过文件索引提取压缩包里的文件流

5 保存上传文件到指定位置

三 参考代码:

1         public string HttpDownloadFile(int tenantId, RequestHeaadModel heaadModel) 2         { 3             var dfsResultPath = string.Empty; 4             var listDfsPath = new List<string>(); 5             try 6             { 7                 #region Http请求参数设置 8                 ServicePointManager.Expect100Continue = false; 9                 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;10                 ServicePointManager.ServerCertificateValidationCallback += (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) => true;11                 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(heaadModel.ResquestParamUrl);12                 request.Headers.Add("x-qys-accesstoken", heaadModel.Accesstoken);13                 request.Headers.Add("x-qys-timestamp", "0");14                 request.Headers.Add("x-qys-signature", heaadModel.Searect);15                 request.ContentType = heaadModel.ContentType;16                 request.Method = "GET";17                 request.Timeout = 100000;18                 request.Accept = "application/octet-stream";19                 #endregion20 21                 #region 对响应的压缩包解析22                 using (WebResponse webRes = request.GetResponse())23                 {24                     #region  1 获取响应的压缩包文件流25                     var length = (long)webRes.ContentLength;26                     var response = webRes as HttpWebResponse;27                     var stream = response.GetResponseStream();28                     #endregion29 30                     #region 2   将压缩包文件流程读取到内存中31                     var stmMemory = new MemoryStream();32                     if (length == -1)33                     {34                         length = 1024;35                     }36                     var buffer = new byte[length];37                     int i;38                     while ((i = stream.Read(buffer, 0, buffer.Length)) > 0)39                     {40                         stmMemory.Write(buffer, 0, i);41                     }42                     #endregion43 44                     #region 3 循环读取压缩包的文件45                     var zipFile_ = new ICSharpCode.SharpZipLib.Zip.ZipFile(stmMemory);46                     int count = int.Parse(zipFile_.Count.ToString());//获取文件个数47                     for (int j = 0; j < count; j++)48                     {49                         var tempSteam = zipFile_.GetInputStream(long.Parse($"{i}"));//压缩包里的文件索引50                         var stmMemory2 = new MemoryStream();51                         var buffer2 = new byte[zipFile_[i].Size];52                         int m;53                         //将单个文件的文件流读取到内存中54                         while ((m = tempSteam.Read(buffer2, 0, buffer2.Length)) > 0)55                         {56                             stmMemory2.Write(buffer2, 0, m);57                         }58                         stmMemory2.Seek(0, SeekOrigin.Begin);59                         var dfsItem = new DfsItem("TenantBaseFile", zipFile_[i].Name,60                             stmMemory2, tenantId);61                         var dfsPath = Dfs.Store(dfsItem);62 63                         Logger.Debug($"下载背调文件地址:{dfsPath.ToString()}");64                         listDfsPath.Add(dfsPath.ToString());65                         stmMemory2.Close();66                         stmMemory2.Flush();67                     }68                     #endregion69                     stmMemory.Close();70                     stmMemory.Flush();71                 }72                 #endregion73             }74             catch (Exception ex)75             {76                 Logger.Debug($"下载报告异常:异常信息:{ex.Message},堆栈信息:{ex.StackTrace}");77             }78 79             return string.Join(",", listDfsPath);80         }

View Code

(0)

相关推荐

  • 如何将文件打成zip包并下载

    @FunctionDesc("下载附件") @RequestMapping(value = "/exportAttachments", method = Req ...

  • C# LINQ学习笔记三:LINQ to OBJECT之操作字符串

    一.统计单词在字符串中出现的次数 请注意,若要执行计数,请先调用Split方法来创建词数组.Split方法存在性能开销,如果对字符串执行的唯一操作是计数词,则应考虑改用Matches或 IndexOf ...

  • 原来华为手机里这些文件夹都可以删!

    大家是不是在自己的华为手机里看到很多文件夹啊?是不是每次看到这些文件夹都一头雾水啊?那今天小编就带大家了解一下华为手机里的文件夹,看看这些文件夹究竟代表什么意思,可不可以删~ 一.以"a(A ...

  • 手机系统里这些文件,一定要删除,不然危害非常大

    使用手机时,我们经常会遇到这样的麻烦,就是手机内存不足这样真的很烦人当我们拿起手机打开文件夹准备删除一堆的垃圾文件却一脸懵逼了看着一堆的文件不知从何下手. 每个安装一个APP系统中就会留下一个文件夹但 ...

  • 我电脑里的文件又多又乱,找不到资料该如何整理?11个超实用建议

    超实用的办公技能,一用就会. 来来自时间管理实践专家 邹小强 的得到锦囊时间管理实践专家,著有<小强升职记>.<只管去做> 1.最快捷的方法不是整理文件,而是正确给文件和文件夹 ...

  • 电脑里的文件和文件夹的命名规则介绍

    我们一般都是把一些资料和文件保存在一个文件夹中,然后通过文件夹的方式归纳起来.以供以后需要的时候查找.那么文件的命名规则是什么呢?今天小编教你文件和文件夹的命名规则介绍到给大家. 文件包含那几个部分, ...

  • 快速批量提取PPT里图片

          PPT具有的功能远远超过我们想象,从视频插入到图片形状.从字体字号到字体颜色.从排版效果到动画使用,只要你愿意,它所具有的千变万化功能让你对它"另眼相看".       ...

  • 优盘里的文件夹怎么设置密码

    推荐答案 林诗云_2019 LV21 2020-02-01 1.单击计算机桌面上的"开始"菜单,在此处找到控制面板. 2.进入"控制面板"进入"系统和 ...

  • 移动硬盘里的文件丢失后如何处理

    红豆3560次浏览2018.05.17 现在的企业,很少再有人用笔纸办公了,随着计算机的普及,大家都开始在使用电脑办公.其实这一点对我们年轻人不算什么,毕竟我们从小学就开始学习电脑啥的使用,但是对于一 ...

  • 怎么把微信里的文件发到QQ?

    C语言答疑课堂 优质科技领域创作者 05-01 10:07 关注 嗯,这个问题很实用,我来答一波.把微信里的文件发到QQ上有两种场景,一种是在手机微信上把文件发到QQ上,一种是在电脑上通过微信把文件发 ...

  • 系统C盘里的文件详解

    Documents and Settings是什么文件? 答案: 是系统用户设置文件夹,包括各个用户的文档.收藏夹.上网浏览信息.配置文件等. 补:这里面的东西不要随便删除,这保存着所有用户的文档和账 ...