Asp.Net Core中下载图片打包zip


1、前言

    好久没有更新博客了,最近没什么假期,但是却比以前还忙!工作、工作、工作,就像赶集似的,聚在一起。这个上海啥时候才能解封困在这里暗无天日的。工作中有那么一个需求客户想要通过自己选择列表的checkbox然后下载所选列表里面的图片,图片我们是存在图片服务器的,下载需要下载图片的一个压缩包zip。

2、思路

因为图片是在图片服务器中的,而部署程序的又是另一台服务器,所以我们先要把所选的图片从图片服务器下载在程序部署的服务器上面,然后压缩这个文件夹返回一个下载链接到客户端。

3、代码

 public object DownBatchImg()
        {
            //返回格式
            object? ret = new();
            try
            {
                // 这里定义了4个图片,号分割  第一个是文件名,后面是图片的网络路径
                List<string> imgList = new()
                {
                    "wyywx.jpg,http://www.yijianlan.com/images/wyywx.jpg",
                    "xylwx.jpg,http://www.yijianlan.com/images/xylwx.jpg",
                    "wyy2x.jpg,http://www.yijianlan.com/images/wyywx.jpg",
                    "xyl3x.jpg,http://www.yijianlan.com/images/xylwx.jpg"
                };
                //定义下载的链接
                string retPath = $"{Request.Scheme}://{Request.Host.Host}:{Request.Host.Port}/UploadFilesDown/BatchImgDown.zip";
                //下载图片文件存放路径 不能跟 返回的下载zip路径是同一个目录
                string savePath = $"{_env.WebRootPath}/UploadFilesTepm/";
                //zip存放路径  绝对路径
                string path = $"{ _env.WebRootPath}/UploadFilesDown/BatchImgDown.zip";
                //之前有下载过的就把之前的删除了
                if (System.IO.File.Exists(path))
                    System.IO.File.Delete(path);
                //创建文件夹 下载图片的文件夹
                if (!Directory.Exists(savePath))
                    Directory.CreateDirectory(savePath);
                //创建文件夹 返回压缩路径
                if (!Directory.Exists($"{ _env.WebRootPath}/UploadFilesDown/"))
                    Directory.CreateDirectory($"{ _env.WebRootPath}/UploadFilesDown/");
                //循环下载图片
                foreach (string it in imgList)
                {
                    //取出文件名跟网络路径
                    var itList = it.Split(',').ToList();
                    //去除所有""
                    itList.RemoveAll(x => x == "");
                    //文件名 wyywx.jpg
                    string fileName = itList[0];
                    //文件网络路径 http://www.yijianlan.com/images/wyywx.jpg
                    string item = itList[1];
                    //网路请求 习惯用HttpClient
                    HttpClient client = new();
                    //读取文件流
                    Stream? stream = client.GetStreamAsync(item).Result;
                    FileStreamResult? fils = File(stream, "application/vnd.android.package-archive", Path.GetFileName(item));
                    string pathLast = savePath + Path.GetFileName(fileName);//存放文件绝对路径跟文件名
                    using (FileStream fs = new(pathLast, FileMode.Create))
                    {
                        //下载图片
                        fils.FileStream.CopyTo(fs);
                    }
                }
                //压缩下载图片所在的文件夹
                ZipFile.CreateFromDirectory(savePath, path);
                //压缩成功就删除下载图片的文件夹
                if (Directory.Exists(savePath))
                    Directory.Delete(savePath, true);
                ret = new
                {
                    code=200,
                    msg="下载打包成功",
                    data= retPath
                };

            }
            catch (Exception ex)
            {
                ret = new
                {
                    code = 500,
                    msg = "系统异常"+ex.Message,
                };
            }
            return ret;
        }

   

    第一个下载链接必须是当前程序部署服务器,包括端口信息,当然程序的中间件访问静态文件要加上去app.UseStaticFiles();

   本文链接 

    这里需要注意的就是 下载的文件夹跟 打包的文件夹一定不能在同一个文件夹下面操作,会报 IO 异常的。

    PASS:心情的颜色是活泼热烈的红色,是生机盎然的绿色,是尊贵华丽的黄色,好好地,用这种种颜色做心情,来书写生活,不要让它变得灰暗  ^_^    。