c#服务端图片打包下载
一,设计多图片打包下载逻辑:
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#服务端图片打包下载的更多相关文章
- 网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例
UDP协议 (了解) 称之为数据包协议,又称不可靠协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需 ...
- CKEditor 自定义按钮插入服务端图片
CKEditor 富文本编辑器很好用,功能很强大,在加上支持服务端图片上传的CKFinder更是方便, 最近在使用CKFinder的时候发现存在很多问题,比如上传图片的时候,图片不能按时间降序排列,另 ...
- 搭建基于.NetFrameWork的私有nuget服务端及打包项目发布上传
一.私有Nuget服务端搭建 1.创建一个.NetFramework web项目 2.在nuget管理中 安装 nuget.server包 3.安装完成后修改web.config里面的 apikey ...
- 数据库blob图片文件,多图片打包下载
数据库存储blob图片文件,前端打包下载 数据库图片文件实体类 package com.cmrh.mspserver.pos.dto; import java.io.Serializable; imp ...
- Node.js 服务端图片处理利器
sharp 是 Node.js 平台上相当热门的一个图像处理库,其实际上是基于 C 语言编写 的 libvips 库封装而来,因此高性能也成了 sharp 的一大卖点.sharp 可以方便地实现常见的 ...
- MySql 服务端与客户端下载地址
mysql官网的注册,要上传户口,才能下载. 在网上搜了个下载地址. mysql-5.6.8-rc http://mysql.stu.edu.tw/Downloads/MySQL-5.6/mysql- ...
- C# 批量图片打包下载
实现点击下载功能,可以一次性下载多个附件.具体实现代码如下 : private void Com_XZTP_FJ(string maiId, string wtfjdz, string CLwtfjd ...
- Qt通过HTTP POST上传文件(python做服务端,附下载)
本文使用Qt Creator用HTTP POST的方法上传文件,并给出一个上传文件的例程. 本文主要客户端,所以对于服务器端程序编写的描述会比较简略 服务器使用Django编写,django服务器接收 ...
- ImageCombiner - Java服务端图片合成的工具包,好用!
自己的第一个也是唯一一个开源项目,因为平时比较懒,很少做宣传,今天刚好突破160个star,发到园子里推荐给大家,算是庆祝一下,哈. 项目地址:https://gitee.com/opensource ...
随机推荐
- 微信小程序-获取当前位置
在 app.json 里面增加 permission 属性配置(小游戏需在game.json中配置): "permission": { "scope.userLocati ...
- 用过消息队列?Kafka?能否手写一个消息队列?懵
是否有同样的经历?面试官问你做过啥项目,我一顿胡侃,项目利用到了消息队列,kafka,rocketMQ等等. 好的,那请开始你的表演,面试官递过一支笔:给我手写一个消息队列!!WHAT? 为了大家遇到 ...
- 【java多线程】volatile 关键字
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语 ...
- scala Futures and Promises
http://docs.scala-lang.org/overviews/core/futures.html Futures and Promises By: Philipp Haller, A ...
- http请求状态码解析
1xx(临时响应) 2xx(成功) 3xx(重定向) 4xx(请求错误) http状态码 400 (错误请求) 服务器不理解请求的语法. http状态码 401 (未授权) 请求要求身份验证. 对于需 ...
- 一起学vue指令之v-text
一起学vue指令之v-text 一起学 vue指令 v-text 指令可看作标签属性 v-text的功能和v-html很相似,都是在容器标签内控制字符串内容的输出,v-text输出纯文本,而v-ht ...
- leetcode-easy-math-412 Fizz Buzz
mycode 99.06% class Solution(object): def fizzBuzz(self, n): """ :type n: int :rtype ...
- 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. ...
- .Net 无法打开Offie Open XML文件(上传和下载使用)
代码: 首先,贴一个上传 public static string UploadFileIntoDir(FileUpload MyFile, string DirName) { if (IfOkFil ...
- failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED 错误解决方法
解决: config = tf.ConfigProto() config.gpu_options.allow_growth = True session = tf.Session(config=con ...