.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 相关文章推荐
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
Apr 02 Javascript
修改file按钮的默认样式实现代码
Apr 23 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
Aug 01 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
Oct 13 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
Aug 04 Javascript
JS实现手写parseInt的方法示例
Sep 24 Javascript
JS实现带阴历的日历功能详解
Jan 24 Javascript
Vue源码分析之Vue实例初始化详解
Aug 25 Javascript
node.js express框架实现文件上传与下载功能实例详解
Oct 15 Javascript
JS运算符简单用法示例
Jan 19 Javascript
JavaScript实现拖拽功能
Feb 11 Javascript
uniapp实现可以左右滑动导航栏
Oct 21 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脚本代码
2011/02/19 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
2017/06/06 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
自动最大化窗口的Javascript代码
2013/05/22 Javascript
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
JavaScript弹出新窗口并控制窗口移动到指定位置的方法
2015/04/06 Javascript
jQuery常用且重要方法汇总
2015/07/13 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
JS开发中基本数据类型具体有哪几种
2017/10/19 Javascript
vue2.0 和 animate.css的结合使用
2017/12/12 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
vue中tab选项卡的实现思路
2018/11/25 Javascript
轻松学习JavaScript函数中的 Rest 参数
2019/05/30 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
python装饰器使用方法实例
2013/11/21 Python
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
pandas数值计算与排序方法
2018/04/12 Python
基于python神经卷积网络的人脸识别
2018/05/24 Python
关于Python3 类方法、静态方法新解
2019/08/30 Python
Python箱型图处理离群点的例子
2019/12/09 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
在python下实现word2vec词向量训练与加载实例
2020/06/09 Python
一款基于css3的列表toggle特效实例教程
2015/01/04 HTML / CSS
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
五一家具促销方案
2014/01/10 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
大专毕业生自我鉴定范文(2篇)
2014/09/27 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书
MySQL数字类型自增的坑
2021/05/07 MySQL