利用blob对象实现文件下载前后端代码实现

前端代码

index.js文件


export function DownloadFile(param){
     return Axios({
        url: #url,
        method: "post",
        responseType: "blob",
        data: param
     })
}

test.vue文件

<template>
    <el-button @click="downloadFile" >下载文件</el-button>

</template>

<script>
import { DownloadFile } from "../test/index"
  export default{
    methods: {
        downloadFile(){
            var data = {}
            DownloadFile(data).then( res => {
                const url = window.URL.createObjectURL(res)
                const a  = document.createElement("a");
                a.href = url;
                a.download = 'text.txt';
                // 将 a 标签添加到 DOM 中,并模拟点击,触发浏览器的下载功能
                document.body.appendChild(a);
                a.click();
                document.body.removeChild(a);
                window.URL.revokeObjectURL(url);
            })
        }
    }
  }
  </script>

后端

Controller层

    @ApiOperation("下载文件")
    @PostMapping("/downloadFile")
    public void downloadFile(HttpServletRequest request,
                                HttpServletResponse response){
        File file = new File("XXX");
        //使用封装下载方法下载文件
        DownloadFileUtil.downloadFile("text.txt",file,response,request);
    }

DownloadFileUtil文件下载工具类

import org.apache.commons.lang3.StringUtils;
import sun.misc.BASE64Encoder;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
public class DownloadFileUtil {

    /**
     * 下载文件
     * @param originalFileName :下载文件的原始文件名
     * @param file             :下载的文件
     * @param response         :相应对象
     */
    public static void downloadFile(String originalFileName, File file, HttpServletResponse response, HttpServletRequest request) {
        // 数据校验
        checkParam(originalFileName,file);

        //相应头的处理
        //清空response中的输出流
        response.reset();
        //设置文件大小
        response.setContentLength((int) file.length());
        //设置Content-Type头
        response.setContentType("application/octet-stream;charset=UTF-8");
        //设置Content-Disposition头 以附件形式解析
        String encodedFilename = getEncodedFilename(request, originalFileName);

        // 解决下载时出现的跨域问题
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "POST");
        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
        response.setHeader("Content-Disposition", "attachment;filename=" + encodedFilename);

        //将来文件流写入response中
        FileInputStream fileInputStream = null;
        ServletOutputStream outputStream = null;
        try {
            //获取文件输入流
            fileInputStream = new FileInputStream(file);
            //创建数据缓冲区
            byte[] buffers = new byte[1024];
            //通过response中获取ServletOutputStream输出流
            outputStream = response.getOutputStream();
            int length;
            while ((length = fileInputStream.read(buffers)) > 0) {
                //写入到输出流中
                outputStream.write(buffers, 0, length);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //流的关闭
            if(fileInputStream != null){
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.flush();
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 下载文件的参数的校验,如果参数不合法则抛出自定义异常
     * @param originalFileName :文件原始文件名
     * @param file :待下载的文件
     */
    private static void checkParam(String originalFileName, File file) {
        if(StringUtils.isBlank(originalFileName)){
            throw new DownloadException("输入的文件原始文件名为空");
        }
        if(file == null || !file.exists() ){
            throw new DownloadException("待在下载的文件不存在!");
        }
    }

    /**
     * 获取URL编码后的原始文件名
     * @param request :客户端请求
     * @param originalFileName :原始文件名
     * @return :
     */
    private static String getEncodedFilename(HttpServletRequest request, String originalFileName) {
        String encodedFilename = null;
        String agent = request.getHeader("User-Agent");
        if(agent.contains("MSIE")){
            //IE浏览器
            try {
                encodedFilename = URLEncoder.encode(originalFileName, "utf-8");
                encodedFilename = encodedFilename.replace("+", " ");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }else if(agent.contains("Firefox")){
            //火狐浏览器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            encodedFilename = "=?utf-8?B?" + base64Encoder.encode(originalFileName.getBytes(StandardCharsets.UTF_8))+"?=";
        }else{
            //其他浏览器
            try {
                encodedFilename = URLEncoder.encode(originalFileName, "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return encodedFilename;
    }
}

下载异常工具类

public class DownloadException extends RuntimeException{
    public DownloadException(String origin){
        super("{"+origin+"}发生了异常:");
    }
    public DownloadException(String origin,Exception ex){
        super("{"+origin+"}发生了异常:"+parseErrMsg(ex));

    }

    private static String parseErrMsg(Exception ex) {
        if(ex == null){
            return "异常堆栈获为空";
        }
        String errMsg = "";
        StackTraceElement[] stackTrace = ex.getStackTrace();
        for (StackTraceElement s : stackTrace) {
            errMsg+="\tat " + s + "\r\n";
        }
        return errMsg;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会回答你的问题。但是需要说明的是,我并不是一个能够直接读取数据库中的blob数据并生成excel文件的程序。我是一个文字AI助手,只能够提供一些相关的代码示例和思路,帮助你完成这个功能。 首先,读取数据库中的blob数据并生成excel文件需要以下几个步骤: 1. 连接数据库,并查询出需要的blob数据。可以使用JDBC或者其他ORM框架来完成这个步骤。 2. 将blob数据转换为excel文件。可以使用Apache POI或者其他的excel操作库来完成这个步骤。具体的方法是:先将blob数据读入到一个InputStream中,然后将这个InputStream作为参数传递给excel操作库的相关方法,即可完成转换。 3. 将生成的excel文件输出到客户端。可以使用Servlet或者其他的web框架来完成这个步骤。具体的方法是:先创建一个输出流,然后将生成的excel文件入到这个输出流中,最后将这个输出流输出到客户端即可。 下面是一个Vue前端通过Blob对象实现导出Excel功能的示例代码: ``` <template> <div> <button @click="exportExcel">导出Excel</button> </div> </template> <script> import axios from 'axios' export default { methods: { async exportExcel() { const response = await axios.get('/api/exportExcel', { responseType: 'blob' }) const blob = new Blob([response.data], { type: 'application/vnd.ms-excel' }) const url = window.URL.createObjectURL(blob) const link = document.createElement('a') link.href = url link.download = 'example.xlsx' link.click() window.URL.revokeObjectURL(url) } } } </script> ``` 这个示例代码中,通过axios库向后端发送一个导出Excel的请求,后端将生成的excel文件作为blob数据返回。前端通过将这个blob数据转换为URL,然后创建一个a标签,将这个URL赋值给a标签的href属性,再将a标签的download属性设置为excel文件文件名,最后通过模拟点击a标签来完成excel文件下载。需要注意的是,这个示例代码中的下载方式不适用于IE浏览器,需要针对IE浏览器进行特殊处理。 希望这个示例代码能够帮助你完成你的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值