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

二,如下代码,ImageUtil

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web; namespace Common
{
/// <summary>
/// 要引用
/// System.IO.Compression.FileSystem
/// System.IO.Compression
/// </summary>
public static class ImageUtil
{
#region 图片打包下载
/// <summary>
/// 下载图片到本地,压缩
/// </summary>
/// <param name="urlList">图片列表</param>
/// <param name="curDirName">要压缩文档的路径</param>
/// <param name="curFileName">压缩后生成文档保存路径</param>
/// <returns></returns>
public static bool ImagePackZip(List<string> urlList, string curDirName, string curFileName)
{
return CommonException(() =>
{
//1.新建文件夹
if (!Directory.Exists(curDirName))
Directory.CreateDirectory(curDirName); //2.下载文件到服务器临时目录
foreach (var url in urlList)
{
DownPicToLocal(url, curDirName + "\\");
Thread.Sleep();//加个延时,避免上一张图还没下载完就执行下一张图的下载操作
} //3.压缩文件夹
if (!File.Exists(curFileName))
ZipFile.CreateFromDirectory(curDirName, curFileName); //压缩 //异步删除压缩前,下载的临时文件
Task.Run(() =>
{
if (Directory.Exists(curDirName))
Directory.Delete(curDirName, true);
});
return true;
});
}
/// <summary>
/// 下载压缩包
/// </summary>
/// <param name="targetfile">目标临时文件地址</param>
/// <param name="filename">文件名</param>
public static bool DownePackZip(string targetfile, string filename)
{
return CommonException(() =>
{
FileInfo fileInfo = new FileInfo(targetfile);
HttpResponse rs = System.Web.HttpContext.Current.Response;
rs.Clear();
rs.ClearContent();
rs.ClearHeaders();
rs.AddHeader("Content-Disposition", "attachment;filename=" + $"{filename}");
rs.AddHeader("Content-Length", fileInfo.Length.ToString());
rs.AddHeader("Content-Transfer-Encoding", "binary");
rs.AddHeader("Pragma", "public");//这两句解决https的cache缓存默认不给权限的问题
rs.AddHeader("Cache-Control", "max-age=0");
rs.ContentType = "application/octet-stream";
rs.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
rs.WriteFile(fileInfo.FullName);
rs.Flush();
rs.End();
return true;
});
} /// <summary>
/// 下载一张图片到本地
/// </summary>
/// <param name="url"></param>
public static bool DownPicToLocal(string url, string localpath)
{
return CommonException(() =>
{
string fileprefix = DateTime.Now.ToString("yyyyMMddhhmmssfff");
var filename = $"{fileprefix}.jpg"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = ;
WebResponse response = request.GetResponse();
using (Stream reader = response.GetResponseStream())
{
FileStream writer = new FileStream(localpath + filename, FileMode.OpenOrCreate, FileAccess.Write);
byte[] buff = new byte[];
int c = ; //实际读取的字节数
while ((c = reader.Read(buff, , buff.Length)) > )
{
writer.Write(buff, , c);
}
writer.Close();
writer.Dispose();
reader.Close();
reader.Dispose();
}
response.Close();
response.Dispose(); return true;
});
}
/// <summary>
/// 公用捕获异常
/// </summary>
/// <param name="func"></param>
/// <returns></returns>
private static bool CommonException(Func<bool> func)
{
try
{
return func.Invoke();
}
catch (Exception ex)
{
return false;
}
}
#endregion
}
}

三,测试MVC代码

using Common;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Web.Mvc; namespace PackImageZip.Controllers
{
public class HomeController : Controller
{
private static object obj = new object();
public ActionResult Contact()
{
///锁,多文件请求打包,存在并发情况
lock (obj)
{
var DownPicpath = System.Web.HttpContext.Current.Server.MapPath("/DownPicPackge");//服务器临时文件目录
string curFileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".zip";
///多次请求文件名一样,睡眠一下
Thread.Sleep();
////保存拉取服务器图片文件夹
string curDirName = $"/{DateTime.Now.ToString("yyyyMMddHHmmssfff")}/"; List<string> urlList = new List<string>();
urlList.Add("https://cdn.duitang.com/uploads/item/201409/08/20140908155026_RdUwH.thumb.700_0.jpeg");
urlList.Add("https://cdn.duitang.com/uploads/item/201409/08/20140908155026_RdUwH.thumb.700_0.jpeg");
urlList.Add("https://cdn.duitang.com/uploads/item/201409/08/20140908155026_RdUwH.thumb.700_0.jpeg");
urlList.Add("https://cdn.duitang.com/uploads/item/201409/08/20140908155026_RdUwH.thumb.700_0.jpeg");
var isOk = ImageUtil.ImagePackZip(urlList, DownPicpath + curDirName, $"{DownPicpath}/{curFileName}");
var json = JsonConvert.SerializeObject(new { isok = isOk.ToString(), curFileName = curDirName });
return Content(json);
}
}
/// <summary>
/// 下载压缩包
/// </summary>
/// <param name="curFileName">文件名</param>
/// <returns></returns>
public ActionResult DownePackZip(string curFileName)
{
try
{
curFileName = curFileName + ".zip";
var DownPicpath = System.Web.HttpContext.Current.Server.MapPath("/DownPicPackge");
var flag = ImageUtil.DownePackZip(DownPicpath + "/" + curFileName, curFileName); ////flag返回包之后就可以删除包,因为包的已经转为流返回给客户端,无需读取源文件
if (flag && Directory.Exists(DownPicpath))
System.IO.File.Delete(DownPicpath + "/" + curFileName);
return Content(flag.ToString());
}
catch (Exception ex)
{
return Content(ex.Message);
} }
}
}

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. hive on tez 任务失败

    最近再hue 集群查询任务经常失败,经过几天的观察,终于找到原因,报错如下 Status: FailedVertex failed, vertexName=Map 1, vertexId=vertex ...

  2. 如何基于String实现同步锁?

    在某些时候,我们可能想基于字符串做一些事情,比如:针对同一用户的并发同步操作,使用锁字符串的方式实现比较合理.因为只有在相同字符串的情况下,并发操作才是不被允许的.而如果我们不分青红皂白直接全部加锁, ...

  3. 20175212童皓桢 《Java程序设计》第11周学习总结

    20175212童皓桢 <Java程序设计>第11周学习总结 教材学习内容总结 一.URL类 1.一个URL对象通常包含最基本的三部分信息:协议.地址.资源 2.构造方法: public ...

  4. Oracle数据库密码过期重置

    oracle登陆密码过期了 这种情况,先连接Oracle,以Oracle用户登录,再输入以下命令: 1,linux系统下,以oracle用户登录进去: su - oracle 2,以系统dba身份登录 ...

  5. 阿里镜像源配置yum

    通过more /etc/*release* 查看系统版本 (需要下载对应的系统版本) mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cen ...

  6. leetcode-easy-dynamic-53 Maximum Subarray

    mycode  66.85% class Solution(object): def maxSubArray(self, nums): """ :type nums: L ...

  7. c++11多线程---线程锁(mutex)

    #include<mutex> 包含四类锁: 1      std::mutex    最基本也是最常用的互斥类 2      std::recursive_mutex  同一线程内可递归 ...

  8. 【转】c语言动态与静态分配

    https://blog.csdn.net/qq_43519310/article/details/85274836 https://blog.csdn.net/qq_38906523/article ...

  9. vue 钩子函数中获取不到DOM节点

    原文链接:https://jingyan.baidu.com/article/f96699bbfe9c9d894f3c1b4b.html 两种解决方案: 1:官方解决方案: 受到 HTML 本身的一些 ...

  10. golang defer那些坑

    defer以下几个特性,使用时需要关注下. 即时的参数传递 调用os.Exit()时defer不会被执行 defer与return的先后顺序 1.即时的参数传递 定义defer时传入的参数,是作为拷贝 ...