zoukankan      html  css  js  c++  java
  • .Net Core实现下载多个文件并压缩打包

    一、本示例使用环境:Net Core3.1、WebAPI、IIS

    二、使用核心类:ZipFile

    三、示例代码(亲测有效)

    using System.Net.Http;
    using System.IO.Compression;

    对线上文件进行打包压缩:

     public async Task<ApiResponse<string>> DownFile()
            {
                //自定义的返回结果类
                ApiResponse<string> result = new ApiResponse<string>();
                try
                {
                    //远程下载多个文件的地址
                    List<string> filePaths = new List<string>() { 
                        "http://model.netai.vip/myupfiles/u4f/201029115909/cover-fece024a-af02-4e75-b78b-ce6b0b2c697f.jpg",
                        "http://model.netai.vip/myupfiles/u4f/201029115909/obj-d7074dca-cead-4bd0-965a-fc60b02db5ce.obj",
                        "http://model.netai.vip/myupfiles/u4f/201029115909/material-3ac7911f-64c0-4765-bf0f-26c0972023aa.mtl",
                        "http://model.netai.vip/myupfiles/u4f/201029115909/handpaint-118835d2-6286-49b5-9cc3-b7e123a41bbd.aim" };
    
                    //多个文件的重命名
                    List<string> fileNames = new List<string>() { "cover.jpg", "obj.obj", "material.mtl", "handpaint.aim" };
    
                    //先判断是否保存有上次打包的压缩文件
                    if (System.IO.File.Exists(Directory.GetCurrentDirectory() + "/wwwroot/ziliao.zip"))
                    {
                        System.IO.File.Delete(Directory.GetCurrentDirectory() + "/wwwroot/ziliao.zip");
                    }
                    //准备用来存放下载的多个文件流目录
                    string pathZip = Directory.GetCurrentDirectory() + "/wwwroot/downfile/";
                    for (int i = 0; i < filePaths.Count; i++)
                    {
                        string newPath = pathZip + "dir"+i;
                        if (!Directory.Exists(newPath))
                        {
                            Directory.CreateDirectory(newPath);
                        }
                        string path = filePaths[i];
                        HttpClient client = new HttpClient();
                        client.BaseAddress = new Uri(path);
                        //根据文件信息中的文件地址获取远程服务器,返回文件流
                        var stream = await client.GetStreamAsync(path);
    
                        var fils = File(stream, "application/vnd.android.package-archive", Path.GetFileName(path));
                        //创建文件流(文件路径,文件操作.创建)
                        using (FileStream fs = new FileStream(newPath + "/" + fileNames[i], FileMode.Create))
                        {
                            //复制文件流
                            fils.FileStream.CopyTo(fs);
                        }
                    }
                    //对多个文件流所在的目录进行压缩
                    ZipFile.CreateFromDirectory(Directory.GetCurrentDirectory() + "/wwwroot/downfile/", Directory.GetCurrentDirectory() + "/wwwroot/" + "ziliao.zip");
                    //删除目录以及目录下的子文件
                    //存在即删除
                    if (Directory.Exists(pathZip))
                    {
                        Directory.Delete(pathZip, true);
                    }
                    //result.code = flag ? StatusCodes.Status200OK : StatusCodes.Status417ExpectationFailed;
                    result.message = "压缩成功";
                }
                catch (Exception ex)
                {
                    result.message = "上传异常,原因:" + ex.Message;
                }
                return result;
            }

    对本地文件进行打包压缩

    /// <summary>
            /// 多文件打包压缩
            /// </summary>
            /// <param name="folderPath">需要打包的文件夹</param>
            /// <param name="zipName">zip文件名</param>
            /// <returns></returns>
            private string PackFiles(string folderPath, string zipName)
            {
                string webRootPath = _hostingEnvironment.WebRootPath;
    
                //导出所存文件夹
                string folder_download = ConfigurationHelper.GetSingleNode("Emporary_Zip_Folder");
    
                //虚拟目录
                string appUrl = ConfigurationHelper.GetSingleNode("File_AppUrl");
    
                #region 打包压缩
    
                //生成导出所存文件夹
                var zip_download = Path.Combine(webRootPath, folder_download);
                if (!System.IO.Directory.Exists(zip_download))
                {
                    System.IO.Directory.CreateDirectory(zip_download);
                }
                var zipPath = Path.Combine(webRootPath, zip_download, zipName);
    
                //CreateFromDirectory(待打包文件夹地址,打包后完整地址),
                ZipFile.CreateFromDirectory(folderPath, zipPath);
    
                //删除打包目录以及目录下的子文件(存在即删除)
                if (Directory.Exists(folderPath))
                {
                    Directory.Delete(folderPath, true);
                }
    
                #endregion
    
                //线上下载地址
                var downloadZipPath = $"{Request.Host}/" + appUrl + $"/{folder_download}/{zipName}";
                return downloadZipPath;
            }
  • 相关阅读:
    angularJS---初识指令
    Bootstrap ACE后台管理界面模板-jquery已整理
    memcached和redis的区别和应用场景
    微信开发,公众号支付及微信扫描支付各自使用的密码分别来自哪里
    微信 redirect_uri参数错误 正确的处理
    jquery jsonp实现跨域
    php 常用的好函数(持续更新)
    pre 随变化的样式
    CSS 居中 可随着浏览器变大变小而居中
    2017.03.02-2017.09.28 日常随笔
  • 原文地址:https://www.cnblogs.com/xiaoxiaomini/p/15625260.html
Copyright © 2011-2022 走看看