一,设计多图片打包下载逻辑:
1,如果是要拉取腾讯云等资源服务器的图片,
2,我们先把远程图片拉取到本地的临时文件夹,
3,然后压缩临时文件夹,
4,压缩完删除临时文件夹,
5,返回压缩完给用户,
6,用户就去请求下载接口,当下载完后,删除压缩包

二,如下代码,ImageUtil

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.IO.Compression;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. using System.Web;
  11.  
  12. namespace Common
  13. {
  14. /// <summary>
  15. /// 要引用
  16. /// System.IO.Compression.FileSystem
  17. /// System.IO.Compression
  18. /// </summary>
  19. public static class ImageUtil
  20. {
  21. #region 图片打包下载
  22. /// <summary>
  23. /// 下载图片到本地,压缩
  24. /// </summary>
  25. /// <param name="urlList">图片列表</param>
  26. /// <param name="curDirName">要压缩文档的路径</param>
  27. /// <param name="curFileName">压缩后生成文档保存路径</param>
  28. /// <returns></returns>
  29. public static bool ImagePackZip(List<string> urlList, string curDirName, string curFileName)
  30. {
  31. return CommonException(() =>
  32. {
  33. //1.新建文件夹
  34. if (!Directory.Exists(curDirName))
  35. Directory.CreateDirectory(curDirName);
  36.  
  37. //2.下载文件到服务器临时目录
  38. foreach (var url in urlList)
  39. {
  40. DownPicToLocal(url, curDirName + "\\");
  41. Thread.Sleep();//加个延时,避免上一张图还没下载完就执行下一张图的下载操作
  42. }
  43.  
  44. //3.压缩文件夹
  45. if (!File.Exists(curFileName))
  46. ZipFile.CreateFromDirectory(curDirName, curFileName); //压缩
  47.  
  48. //异步删除压缩前,下载的临时文件
  49. Task.Run(() =>
  50. {
  51. if (Directory.Exists(curDirName))
  52. Directory.Delete(curDirName, true);
  53. });
  54. return true;
  55. });
  56. }
  57. /// <summary>
  58. /// 下载压缩包
  59. /// </summary>
  60. /// <param name="targetfile">目标临时文件地址</param>
  61. /// <param name="filename">文件名</param>
  62. public static bool DownePackZip(string targetfile, string filename)
  63. {
  64. return CommonException(() =>
  65. {
  66. FileInfo fileInfo = new FileInfo(targetfile);
  67. HttpResponse rs = System.Web.HttpContext.Current.Response;
  68. rs.Clear();
  69. rs.ClearContent();
  70. rs.ClearHeaders();
  71. rs.AddHeader("Content-Disposition", "attachment;filename=" + $"{filename}");
  72. rs.AddHeader("Content-Length", fileInfo.Length.ToString());
  73. rs.AddHeader("Content-Transfer-Encoding", "binary");
  74. rs.AddHeader("Pragma", "public");//这两句解决https的cache缓存默认不给权限的问题
  75. rs.AddHeader("Cache-Control", "max-age=0");
  76. rs.ContentType = "application/octet-stream";
  77. rs.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
  78. rs.WriteFile(fileInfo.FullName);
  79. rs.Flush();
  80. rs.End();
  81. return true;
  82. });
  83. }
  84.  
  85. /// <summary>
  86. /// 下载一张图片到本地
  87. /// </summary>
  88. /// <param name="url"></param>
  89. public static bool DownPicToLocal(string url, string localpath)
  90. {
  91. return CommonException(() =>
  92. {
  93. string fileprefix = DateTime.Now.ToString("yyyyMMddhhmmssfff");
  94. var filename = $"{fileprefix}.jpg";
  95.  
  96. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  97. request.Timeout = ;
  98. WebResponse response = request.GetResponse();
  99. using (Stream reader = response.GetResponseStream())
  100. {
  101. FileStream writer = new FileStream(localpath + filename, FileMode.OpenOrCreate, FileAccess.Write);
  102. byte[] buff = new byte[];
  103. int c = ; //实际读取的字节数
  104. while ((c = reader.Read(buff, , buff.Length)) > )
  105. {
  106. writer.Write(buff, , c);
  107. }
  108. writer.Close();
  109. writer.Dispose();
  110. reader.Close();
  111. reader.Dispose();
  112. }
  113. response.Close();
  114. response.Dispose();
  115.  
  116. return true;
  117. });
  118. }
  119. /// <summary>
  120. /// 公用捕获异常
  121. /// </summary>
  122. /// <param name="func"></param>
  123. /// <returns></returns>
  124. private static bool CommonException(Func<bool> func)
  125. {
  126. try
  127. {
  128. return func.Invoke();
  129. }
  130. catch (Exception ex)
  131. {
  132. return false;
  133. }
  134. }
  135. #endregion
  136. }
  137. }

三,测试MVC代码

  1. using Common;
  2. using Newtonsoft.Json;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Threading;
  8. using System.Web.Mvc;
  9.  
  10. namespace PackImageZip.Controllers
  11. {
  12. public class HomeController : Controller
  13. {
  14. private static object obj = new object();
  15. public ActionResult Contact()
  16. {
  17. ///锁,多文件请求打包,存在并发情况
  18. lock (obj)
  19. {
  20. var DownPicpath = System.Web.HttpContext.Current.Server.MapPath("/DownPicPackge");//服务器临时文件目录
  21. string curFileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".zip";
  22. ///多次请求文件名一样,睡眠一下
  23. Thread.Sleep();
  24. ////保存拉取服务器图片文件夹
  25. string curDirName = $"/{DateTime.Now.ToString("yyyyMMddHHmmssfff")}/";
  26.  
  27. List<string> urlList = new List<string>();
  28. urlList.Add("https://cdn.duitang.com/uploads/item/201409/08/20140908155026_RdUwH.thumb.700_0.jpeg");
  29. urlList.Add("https://cdn.duitang.com/uploads/item/201409/08/20140908155026_RdUwH.thumb.700_0.jpeg");
  30. urlList.Add("https://cdn.duitang.com/uploads/item/201409/08/20140908155026_RdUwH.thumb.700_0.jpeg");
  31. urlList.Add("https://cdn.duitang.com/uploads/item/201409/08/20140908155026_RdUwH.thumb.700_0.jpeg");
  32. var isOk = ImageUtil.ImagePackZip(urlList, DownPicpath + curDirName, $"{DownPicpath}/{curFileName}");
  33. var json = JsonConvert.SerializeObject(new { isok = isOk.ToString(), curFileName = curDirName });
  34. return Content(json);
  35. }
  36. }
  37. /// <summary>
  38. /// 下载压缩包
  39. /// </summary>
  40. /// <param name="curFileName">文件名</param>
  41. /// <returns></returns>
  42. public ActionResult DownePackZip(string curFileName)
  43. {
  44. try
  45. {
  46. curFileName = curFileName + ".zip";
  47. var DownPicpath = System.Web.HttpContext.Current.Server.MapPath("/DownPicPackge");
  48. var flag = ImageUtil.DownePackZip(DownPicpath + "/" + curFileName, curFileName);
  49.  
  50. ////flag返回包之后就可以删除包,因为包的已经转为流返回给客户端,无需读取源文件
  51. if (flag && Directory.Exists(DownPicpath))
  52. System.IO.File.Delete(DownPicpath + "/" + curFileName);
  53. return Content(flag.ToString());
  54. }
  55. catch (Exception ex)
  56. {
  57. return Content(ex.Message);
  58. }
  59.  
  60. }
  61. }
  62. }

c#服务端图片打包下载的更多相关文章

  1. 网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例

    UDP协议 (了解) 称之为数据包协议,又称不可靠协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需 ...

  2. CKEditor 自定义按钮插入服务端图片

    CKEditor 富文本编辑器很好用,功能很强大,在加上支持服务端图片上传的CKFinder更是方便, 最近在使用CKFinder的时候发现存在很多问题,比如上传图片的时候,图片不能按时间降序排列,另 ...

  3. 搭建基于.NetFrameWork的私有nuget服务端及打包项目发布上传

    一.私有Nuget服务端搭建 1.创建一个.NetFramework web项目 2.在nuget管理中 安装 nuget.server包 3.安装完成后修改web.config里面的 apikey ...

  4. 数据库blob图片文件,多图片打包下载

    数据库存储blob图片文件,前端打包下载 数据库图片文件实体类 package com.cmrh.mspserver.pos.dto; import java.io.Serializable; imp ...

  5. Node.js 服务端图片处理利器

    sharp 是 Node.js 平台上相当热门的一个图像处理库,其实际上是基于 C 语言编写 的 libvips 库封装而来,因此高性能也成了 sharp 的一大卖点.sharp 可以方便地实现常见的 ...

  6. MySql 服务端与客户端下载地址

    mysql官网的注册,要上传户口,才能下载. 在网上搜了个下载地址. mysql-5.6.8-rc http://mysql.stu.edu.tw/Downloads/MySQL-5.6/mysql- ...

  7. C# 批量图片打包下载

    实现点击下载功能,可以一次性下载多个附件.具体实现代码如下 : private void Com_XZTP_FJ(string maiId, string wtfjdz, string CLwtfjd ...

  8. Qt通过HTTP POST上传文件(python做服务端,附下载)

    本文使用Qt Creator用HTTP POST的方法上传文件,并给出一个上传文件的例程. 本文主要客户端,所以对于服务器端程序编写的描述会比较简略 服务器使用Django编写,django服务器接收 ...

  9. ImageCombiner - Java服务端图片合成的工具包,好用!

    自己的第一个也是唯一一个开源项目,因为平时比较懒,很少做宣传,今天刚好突破160个star,发到园子里推荐给大家,算是庆祝一下,哈. 项目地址:https://gitee.com/opensource ...

随机推荐

  1. 微信小程序-获取当前位置

    在 app.json 里面增加 permission 属性配置(小游戏需在game.json中配置): "permission": { "scope.userLocati ...

  2. 用过消息队列?Kafka?能否手写一个消息队列?懵

    是否有同样的经历?面试官问你做过啥项目,我一顿胡侃,项目利用到了消息队列,kafka,rocketMQ等等. 好的,那请开始你的表演,面试官递过一支笔:给我手写一个消息队列!!WHAT? 为了大家遇到 ...

  3. 【java多线程】volatile 关键字

    在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语 ...

  4. scala Futures and Promises

    http://docs.scala-lang.org/overviews/core/futures.html  Futures and Promises   By: Philipp Haller, A ...

  5. http请求状态码解析

    1xx(临时响应) 2xx(成功) 3xx(重定向) 4xx(请求错误) http状态码 400 (错误请求) 服务器不理解请求的语法. http状态码 401 (未授权) 请求要求身份验证. 对于需 ...

  6. 一起学vue指令之v-text

    一起学vue指令之v-text 一起学 vue指令 v-text  指令可看作标签属性 v-text的功能和v-html很相似,都是在容器标签内控制字符串内容的输出,v-text输出纯文本,而v-ht ...

  7. leetcode-easy-math-412 Fizz Buzz

    mycode  99.06% class Solution(object): def fizzBuzz(self, n): """ :type n: int :rtype ...

  8. CentOS 6.4 yum快速搭建Zabbix 2.2版本(中文)

    1.安装zabbix官方epel包 rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6. ...

  9. .Net 无法打开Offie Open XML文件(上传和下载使用)

    代码: 首先,贴一个上传 public static string UploadFileIntoDir(FileUpload MyFile, string DirName) { if (IfOkFil ...

  10. failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED 错误解决方法

    解决: config = tf.ConfigProto() config.gpu_options.allow_growth = True session = tf.Session(config=con ...