.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 相关文章推荐
js加解密 脚本解密
Feb 22 Javascript
javascript 年月日联动实现核心代码
Dec 21 Javascript
Iframe 自动适应页面的高度示例代码
Feb 26 Javascript
深入理解javascript构造函数和原型对象
Sep 23 Javascript
详解使用JS如何制作简单的ASCII图与单极图
Mar 31 Javascript
带你了解session和cookie作用原理区别和用法
Aug 14 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
Mar 21 Javascript
最简单的vue消息提示全局组件的方法
Jun 16 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
Aug 23 Javascript
详解ES6新增字符串扩张方法includes()、startsWith()、endsWith()
May 12 Javascript
vue.js实现双击放大预览功能
Jun 23 Javascript
VUE项目axios请求头更改Content-Type操作
Jul 24 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单例模式实现(对象只被创建一次)
2012/12/05 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
PHP微信开发之二维码生成类
2015/06/26 PHP
php实现压缩合并js的方法【附demo源码下载】
2016/09/22 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
js 居中漂浮广告
2010/03/21 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
2015/06/10 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
js仿淘宝评价评分功能
2017/02/28 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
基于D3.js实现时钟效果
2018/07/17 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
重学JS 系列:聊聊继承(推荐)
2019/04/11 Javascript
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
快速入手Python字符编码
2016/08/03 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
2018/04/18 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
Python unittest如何生成HTMLTestRunner模块
2020/09/08 Python
软件配置管理有什么好处
2015/04/15 面试题
分公司经理岗位职责
2013/11/11 职场文书
大学新生欢迎词
2014/01/10 职场文书
机关财务管理制度
2014/01/17 职场文书
小学生环保标语
2014/06/13 职场文书
鼓舞士气的口号
2014/06/16 职场文书
党支部三会一课计划
2014/09/24 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
党员带头倡议书
2015/04/29 职场文书
2016年党员承诺书范文
2016/03/24 职场文书
pygame面向对象的飞行小鸟实现(Flappy bird)
2021/04/01 Python