Vue不能下载xls以及文件乱码问题解决

yizhihongxing

下面我来详细讲解Vue不能下载xls以及文件乱码问题的解决方法。

问题描述

在Vue项目中,可能出现下载xls文件时出现乱码或者无法下载的情况。这是因为Vue框架默认的数据传输格式是JSON,无法直接传输二进制文件,需要经过一定的处理解决才能实现文件下载。

解决方法

解决Vue不能下载xls以及文件乱码问题,需要进行以下几个步骤:

1. 设置服务端响应头

在服务端响应头中设置Content-Type和Content-Disposition,其中Content-Type为文件类型,Content-Disposition为在浏览器中弹出下载框的设置。代码如下:

let filename = 'test.xls'; // 文件名
res.setHeader('Content-Type', 'application/vnd.ms-excel;charset=utf-8');
res.setHeader('Content-Disposition', 'attachment;filename=' + encodeURIComponent(filename));

2. 将文件流转化为blob对象

在前端中,我们需要将服务端返回的二进制流文件转化为blob对象,代码如下:

let blob = new Blob([res.data], { type: 'application/vnd.ms-excel' });
let downloadElement = document.createElement('a');
let href = window.URL.createObjectURL(blob); // 创建下载链接
downloadElement.href = href;
downloadElement.download = filename; // 下载后文件名
document.body.appendChild(downloadElement);
downloadElement.click();
document.body.removeChild(downloadElement); // 下载完成移除元素
window.URL.revokeObjectURL(href); // 释放掉URL对象

将blob对象转化为URL,然后生成一个a标签,设置下载链接和下载文件名,最后模拟点击下载链接实现文件下载。

3. 处理乱码问题

有时候在下载xls文件时,会出现中文乱码的情况。此时需要在服务端设置charset为utf-8,同时将文件名使用encodeURIComponent进行编码,代码如下:

let filename = '测试.xls'; // 文件名为中文
res.setHeader('Content-Type', 'application/vnd.ms-excel;charset=utf-8');
res.setHeader('Content-Disposition', 'attachment;filename=' + encodeURIComponent(filename));

在前端使用decodeURIComponent进行解码,代码如下:

let downloadElement = document.createElement('a');
let href = window.URL.createObjectURL(blob); // 创建下载链接
downloadElement.href = decodeURIComponent(href);
downloadElement.download = decodeURIComponent(filename); // 下载后文件名
document.body.appendChild(downloadElement);
downloadElement.click();
document.body.removeChild(downloadElement); // 下载完成移除元素
window.URL.revokeObjectURL(href); // 释放掉URL对象

示例说明

示例一

下面是一个使用axios进行文件下载的示例:

downLoadExcel() {
  axios({
    method: 'get',
    url: `/api/excel`,
    responseType: 'arraybuffer'
  }).then((res) => {
    let blob = new Blob([res.data], { type: 'application/vnd.ms-excel' });
    let filename = 'test.xls';
    let downloadElement = document.createElement('a');
    let href = window.URL.createObjectURL(blob); // 创建下载链接
    downloadElement.href = href;
    downloadElement.download = filename;
    document.body.appendChild(downloadElement);
    downloadElement.click();
    document.body.removeChild(downloadElement); // 下载完成移除元素
    window.URL.revokeObjectURL(href); // 释放掉URL对象
  }).catch((error) => {
    console.log(error);
  });
}

示例二

下面是一个使用fetch进行文件下载的示例:

downLoadExcel() {
  fetch(`/api/excel`, {
    method: 'GET',
    headers: {
      'Content-Type': 'application/json;charset=utf-8'
    }
  }).then(res => {
    let filename = 'test.xls';
    res.blob().then(blob => {
      let downloadElement = document.createElement('a');
      let href = window.URL.createObjectURL(blob); // 创建下载链接
      downloadElement.href = href;
      downloadElement.download = filename;
      document.body.appendChild(downloadElement);
      downloadElement.click();
      document.body.removeChild(downloadElement); // 下载完成移除元素
      window.URL.revokeObjectURL(href); // 释放掉URL对象
    })
  }).catch((error) => {
    console.log(error);
  })
}

以上就是Vue不能下载xls以及文件乱码问题的详细解决攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue不能下载xls以及文件乱码问题解决 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue 中使用vue2-highcharts实现曲线数据展示的方法

    接下来我将详细讲解“Vue 中使用vue2-highcharts实现曲线数据展示的方法”的完整攻略。首先介绍一下vue2-highcharts,它是一种基于Highcharts的Vue2.x插件,可以在Vue项目中方便地使用Highcharts图表。接下来,我将深入讲解如何使用vue2-highcharts来实现曲线数据展示。 步骤一:安装vue2-high…

    Vue 2023年5月28日
    00
  • Vue data的数据响应式到底是如何实现的

    那么让我们来详细讲解一下Vue data的数据响应式实现的攻略。 什么是Vue数据响应式? Vue框架的核心功能之一就是数据响应式。所谓数据响应式,是指当Vue中的某个数据发生变化时,框架可以自动更新依赖这个数据的视图。 Vue数据响应式的实现原理 Vue数据响应式的实现原理主要包括两部分: Object.defineProperty Vue数据响应式是通过…

    Vue 2023年5月27日
    00
  • Vue render函数使用详细讲解

    当我们想要使用Vue.js中的复杂组件来构建交互式应用程序时,我们需要使用render函数来创建虚拟DOM。使用render函数,我们可以直接返回虚拟DOM节点而不需要使用模板。本文将为您介绍Vue render函数的详细用法和示例。 什么是render函数? render函数是Vue.js中一个用于构建虚拟DOM的方法。它是一个纯JavaScript函数,…

    Vue 2023年5月28日
    00
  • vue在标签中如何使用(data-XXX)自定义属性并获取

    在Vue中,如果需要向组件或标签添加自定义属性,可以使用HTML5中的data-*属性。例如:data-xxx。在组件或标签中定义的自定义属性,可以使用Vue的$refs属性获取。 以下是示例: 示例1: 定义了一个自定义属性data-title,并且用v-bind将该属性绑定到组件的title属性中。 <template> <div&gt…

    Vue 2023年5月28日
    00
  • 详解Vue3中ref和reactive函数的使用

    那么首先我们需要了解Vue3中ref和reactive函数的基本用法。 什么是ref和reactive函数 在Vue3中,数据响应式的核心原理是基于ES6提供的新特性Proxy进行实现的。ref和reactive有以下作用: ref函数:用于创建一个响应式的基本数据类型变量。 reactive函数:用于创建一个响应式的对象数据类型变量。 ref函数的基本用法…

    Vue 2023年5月28日
    00
  • 为Vue3 组件标注 TS 类型实例详解

    为Vue3组件标注TS类型实例详解, 为什么要在Vue3中为组件标注TS类型 Vue3已经全面拥抱TypeScript,Vue2中虽然也可以使用TypeScript,但是不如在Vue3中使用简单直观。为Vue3中的组件标注TS类型能够帮助我们减少代码出错的可能性,能够在开发阶段就发现类型不匹配的问题。因为标注了TS类型,编辑器也可以给我们更好的编码体验,例如…

    Vue 2023年5月27日
    00
  • Vant的Tabbar标签栏引入自定义图标方式

    要在Vant的Tabbar标签栏中引入自定义图标,必须经过以下步骤: 1. 准备图标资源 首先需要准备自己所需要使用的图标的资源。可以使用现有的iconfont字体图标库,也可以将自己的图标转换成字体图标库。请注意,如果使用的是自己的图标,请确保它们的尺寸是一致的。可以使用在线工具将图标转换成相应的字体格式,例如icomoon。 2. 安装Vant 安装Va…

    Vue 2023年5月27日
    00
  • vue3动态组件使用详解

    什么是动态组件 Vue 3 中的动态组件是一种非常方便的技巧,可以根据需要动态选择并呈现组件。实现动态组件可以通过标签的 is 特性来实现。例如,假设我们有这样一个父组件: <template> <div> <component :is="currentComponent"></component…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部