栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

C#服务端图片打包下载实现代码解析

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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
{
  /// 
  /// 要引用
  /// System.IO.Compression.FileSystem
  /// System.IO.Compression
  /// 
  public static class ImageUtil
  {
    #region 图片打包下载
    /// 
    /// 下载图片到本地,压缩
    /// 
    /// 图片列表
    /// 要压缩文档的路径
    /// 压缩后生成文档保存路径
    /// 
    public static bool ImagePackZip(List 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(60);//加个延时,避免上一张图还没下载完就执行下一张图的下载操作
 }

 //3.压缩文件夹
 if (!File.Exists(curFileName))
   ZipFile.CreateFromDirectory(curDirName, curFileName); //压缩

 //异步删除压缩前,下载的临时文件
 Task.Run(() =>
 {
   if (Directory.Exists(curDirName))
     Directory.Delete(curDirName, true);
 });
 return true;
      });
    }
    /// 
    /// 下载压缩包
    /// 
    /// 目标临时文件地址
    /// 文件名
    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;
      });
    }

    /// 
    /// 下载一张图片到本地
    /// 
    /// 
    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 = 60000;
 WebResponse response = request.GetResponse();
 using (Stream reader = response.GetResponseStream())
 {
   FileStream writer = new FileStream(localpath + filename, FileMode.OpenOrCreate, FileAccess.Write);
   byte[] buff = new byte[512];
   int c = 0; //实际读取的字节数
   while ((c = reader.Read(buff, 0, buff.Length)) > 0)
   {
     writer.Write(buff, 0, c);
   }
   writer.Close();
   writer.Dispose();
   reader.Close();
   reader.Dispose();
 }
 response.Close();
 response.Dispose();

 return true;
      });
    }
    /// 
    /// 公用捕获异常
    /// 
    /// 
    /// 
    private static bool CommonException(Func 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(2000);
 ////保存拉取服务器图片文件夹
 string curDirName = $"/{DateTime.Now.ToString("yyyyMMddHHmmssfff")}/";

 List urlList = new List();
 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);
      }
    }
    /// 
    /// 下载压缩包
    /// 
    /// 文件名
    /// 
    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);
      }

    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/121941.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号