• 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();

       本文链接 https://www.cnblogs.com/w5942066/p/16244230.html

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

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

  • 相关阅读:
    今天遇到的报错Babel noteThe code generator has deoptimised the styling of ...as it exceeds the max of 500KB.
    轻松理解Promise.all 、Promise.then、Promise.race有什么区别以及使用方法
    JS循环类数组对象,获得页面所有的某个ClssaName,处理它的属性
    Angular在用户登录后设置授权请求头headers.append('Authorization', 'token');
    webpack配置less以及js中引入的图片问题
    超级容易理解的Three.js中的物体rotation
    新下载了一个框架,然后npm install时候报错npm ERR! Maximum call stack size exceeded
    webpack打包后发现有一部分代码还携带注释,如何解决?/webpack打包删除注释以及console.log--快快点进来看一看吧~~
    composer 下载扩展包
    postman 模拟登录状态
  • 原文地址:https://www.cnblogs.com/w5942066/p/16244230.html
Copyright © 2020-2023  润新知