.netcore+vue 实现压缩文件下载功能


Posted in Javascript onSeptember 24, 2020

一.前言

目前接触的项目中,给定的需求是将系统内所有用户的数据整理好,并保存到文件夹内,目的主要是防止用户在实施人员已配置好的基础上由于不熟悉系统,导致的误删或者误操作。减少实施人员的配置工作。我首先想到的就是将数据导入到Excel中,并以各个用户的名称命名文件夹做好分类。

vue下实现Excel导入这个我们见的比较多了,当时我也确实实现了下载Excel的功能,但是后续发现保存的文件都在服务器上,那就有一个问题了,实施人员是通过页面点击的一键保存按钮,数据也确实保存了,但是却是在服务器上,如果想实时看到数据呢,是不是还要去服务器上拷贝一份下来。相对来讲确实比较繁琐,所以整理了下载压缩文件到本地的功能,一起看一下怎么实现的吧。

1.1.net core 压缩文件

思路是在后台将文件夹整体压缩为zip格式的压缩包,并返回文件流到前端,然后前端接收文件流实现浏览器下载的功能。

后端代码,将

public async Task<FileStreamResult> DownloadFiles(DownLoadModel input)
    {
      if (!Directory.Exists(input.pathUrl))
      {
        throw new UserFriendlyException("当前要下载的文件夹不存在或已删除");
      }
      var zipFileUrl = _configurationRoot["downLoadUrlConf:downloadZipFileUrl"];
      if (File.Exists(zipFileUrl))
      {
        File.Delete(zipFileUrl);
      }
      ZipHelper.CreateZip(input.pathUrl, zipFileUrl);
      var memoryStream = new MemoryStream();
      using (var stream = new FileStream(zipFileUrl, FileMode.Open))
      {
        await stream.CopyToAsync(memoryStream);
      }
      memoryStream.Seek(0, SeekOrigin.Begin);
      return new FileStreamResult(memoryStream, "application/octet-stream");//文件流方式,指定文件流对应的ContenType。
    }
public static class ZipHelper
  {
    /// <summary>
    /// 压缩文件
    /// </summary>
    /// <param name="sourceFilePath"></param>
    /// <param name="destinationZipFilePath"></param>
    public static void CreateZip(string sourceFilePath, string destinationZipFilePath)
    {
      if (sourceFilePath[sourceFilePath.Length - 1] != System.IO.Path.DirectorySeparatorChar)
        sourceFilePath += System.IO.Path.DirectorySeparatorChar;

      ZipOutputStream zipStream = new ZipOutputStream(File.Create(destinationZipFilePath));
      zipStream.SetLevel(6); // 压缩级别 0-9
      CreateZipFiles(sourceFilePath, zipStream, sourceFilePath);

      zipStream.Finish();
      zipStream.Close();
    }
    /// <summary>
    /// 递归压缩文件
    /// </summary>
    /// <param name="sourceFilePath">待压缩的文件或文件夹路径</param>
    /// <param name="zipStream">
    /// <param name="staticFile"></param>
    private static void CreateZipFiles(string sourceFilePath, ZipOutputStream zipStream, string staticFile)
    {
      Crc32 crc = new Crc32();
      string[] filesArray = Directory.GetFileSystemEntries(sourceFilePath);
      foreach (string file in filesArray)
      {
        if (Directory.Exists(file))           //如果当前是文件夹,递归
        {
          CreateZipFiles(file, zipStream, staticFile);
        }

        else                      //如果是文件,开始压缩
        {
          FileStream fileStream = File.OpenRead(file);

          byte[] buffer = new byte[fileStream.Length];
          fileStream.Read(buffer, 0, buffer.Length);
          string tempFile = file.Substring(staticFile.LastIndexOf("\\") + 1);
          ZipEntry entry = new ZipEntry(tempFile);

          entry.DateTime = DateTime.Now;
          entry.Size = fileStream.Length;
          fileStream.Close();
          crc.Reset();
          crc.Update(buffer);
          entry.Crc = crc.Value;
          zipStream.PutNextEntry(entry);

          zipStream.Write(buffer, 0, buffer.Length);
        }
      }
    }
  }

其中CreateZip方法传入一个源文件的路径,一个目标文件的路径,这里我的目标文件设置在appsetting.json里是个临时路径,只为前端当次下载使用。这样我们就在后台将数据以压缩包的形式压缩好,并返回数据流给前端了。

1.2 vue 下载压缩文件

<el-button
     icon="el-icon-download"
     size="mini"
     type="primary"
     class="pull-right"
     @click="downloadFile"
    >下载文件到本地</el-button>
downloadFile() {
    this.loading = true;
    let postData = { pathUrl: this.filePathMag };
    AjaxHelper.post(this.downLoadUrl, postData, {
     responseType: "blob",
    }).then((res) => {
     // 处理返回的文件流
     const content = res.data;
     const blob = new Blob([content], { type: "application/zip" });
     const fileName = this.tenant.name + "配置信息.zip";
     if ("download" in document.createElement("a")) {
      // 非IE下载
      const elink = document.createElement("a");
      elink.download = fileName;
      elink.style.display = "none";
      elink.href = URL.createObjectURL(blob);
      document.body.appendChild(elink);
      elink.click();
      URL.revokeObjectURL(elink.href); // 释放URL 对象
      document.body.removeChild(elink);
     } else {
      // IE10+下载
      navigator.msSaveBlob(blob, fileName);
     }
     this.loading = false;
    });
   },

之前下载Excel时,我们传入后端的content-type为"application/json;application/octet-stream",经过测试发现压缩文件不能使用这种content-type,所以我们去掉了。
另外就是const blob = new Blob([content], { type: "application/zip" });这行代码,如果不加,虽然也能下载,但是下载后的压缩包却无法打开,提示压缩不正确或压缩包已损坏。

好了,到此压缩文件的下载就完成了,由于我也是第一次遇到压缩文件的下载,经过摸索终于解决了问题。看起来也比较简单,你学会使用了吗?

总结

到此这篇关于.netcore+vue 实现压缩文件下载的文章就介绍到这了,更多相关vue 实现压缩文件下载内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JavaScript中的typeof操作符用法实例
Apr 05 Javascript
js判断横竖屏及禁止浏览器滑动条示例
Apr 29 Javascript
javascript 处理null及null值示例
Jun 09 Javascript
bootstrap data与jquery .data
Jul 07 Javascript
php+ajax+jquery实现点击加载更多内容
May 03 Javascript
以Python代码实例展示kNN算法的实际运用
Oct 26 Javascript
AngularJS应用开发思维之依赖注入3
Aug 19 Javascript
jQuery中JSONP的两种实现方式详解
Sep 26 Javascript
JS基于对象的特性实现去除数组中重复项功能详解
Nov 17 Javascript
jQuery Validate插件ajax方式验证输入值的实例
Dec 21 jQuery
JavaScript 作用域scope简单汇总
Oct 23 Javascript
vue 中的 render 函数作用详解
Feb 28 Javascript
vue-router 控制路由权限的实现
Sep 24 #Javascript
vue+elementUI实现简单日历功能
Sep 24 #Javascript
JavaScript获取时区实现过程解析
Sep 24 #Javascript
小程序点餐界面添加购物车左右摆动动画
Sep 23 #Javascript
原生js实现购物车功能
Sep 23 #Javascript
详解微信小程序动画Animation执行过程
Sep 23 #Javascript
原生js实现分页效果
Sep 23 #Javascript
You might like
php下载excel无法打开的解决方法
2013/12/24 PHP
神盾加密解密教程(二)PHP 神盾解密
2014/06/08 PHP
CI框架给视图添加动态数据
2014/12/01 PHP
PHP获取文件扩展名的方法实例总结
2017/06/10 PHP
详解Yii2.0使用AR联表查询实例
2017/06/16 PHP
JavaScript中的View-Model使用介绍
2011/08/11 Javascript
javascript设计模式之工厂模式示例讲解
2014/03/04 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
js实现的Easy Tabs选项卡用法实例
2015/09/06 Javascript
基于JavaScript实现移动端TAB触屏切换效果
2015/10/20 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
Vue中建立全局引用或者全局命令的方法
2017/08/21 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
用Python程序抓取网页的HTML信息的一个小实例
2015/05/02 Python
python自定义类并使用的方法
2015/05/07 Python
python学习教程之使用py2exe打包
2017/09/24 Python
python深度优先搜索和广度优先搜索
2018/02/07 Python
django-初始配置(纯手写)详解
2019/07/30 Python
Python实现迪杰斯特拉算法过程解析
2020/09/18 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
如何现实servlet的单线程模式
2014/08/05 面试题
周鸿祎:教你写创业计划书
2013/12/30 职场文书
高中生操行评语
2014/04/25 职场文书
求职信范文大全
2014/05/26 职场文书
小学师德师风整改措施
2014/10/27 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
利用js实现简单开关灯代码
2021/11/23 Javascript
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers