spring mvc 文件下载

在web中下载的方式大多基于servlet,在web.xml中配置下载路径,这里再介绍json(转成base64字符串)和blob的使用方式

servlet

WEB-INF/web.xml

XML 复制代码
<!--url映射-->
<servlet-mapping>
	<servlet-name>DowloadServlet</servlet-name>
	<url-pattern>/servlet/dowloadFile</url-pattern>
</servlet-mapping>


<!--指定servlet-->
<servlet>
	<servlet-name>DowloadServlet</servlet-name>
	<servlet-class>com.xxxxxx.servlet.DowloadServlet</servlet-class>
</servlet>

servlet代码

java 复制代码
protected void download(String path, String fileName) {
        File file = new File(path);
        if (!file.exists()) {
            logger.error("下载的文件不存在 path=" + path + ",fileName=" + fileName);
        }
        //下载
        OutputStream out = null;
        BufferedInputStream in = null;
        try {
            getResponse().setCharacterEncoding("UTF-8");
            getResponse().setContentType("application/vnd.ms-excel");
            getResponse().setHeader("Content-Disposition", "attachment; filename=" + fileName);
            out = getResponse().getOutputStream();
            in = new BufferedInputStream(new FileInputStream(path));
            int line;
            while ((line = in.read()) != -1) {
                out.write(line);
            }
        } catch (Exception ex) {
            logger.error("下载文件失败 path=" + path, ex);
        } finally {
            if (null != out) {
                try {
                    out.close();
                } catch (Exception ex) {
                    logger.error("关闭out异常 path=" + path, ex);
                }
            }
            if (null != in) {
                try {
                    in.close();
                } catch (Exception ex) {
                    logger.error("关闭in异常 path=" + path, ex);
                }
            }
        }
    }

js代码

通过浏览器进行下载

html 复制代码
<a href="/serlvet/dowloadFile">下载</a> 

或者

window.open("/serlvet/dowloadFile")

blob

controller

关键在这响应头:application/octet-stream

java 复制代码
protected void download(String path, String fileName) {
        File file = new File(path);
        if (!file.exists()) {
            logger.error("下载的文件模板不存在 path=" + path + ",fileName=" + fileName);
        }
        //下载
        OutputStream out = null;
        BufferedInputStream in = null;
        try {
            getResponse().setCharacterEncoding("UTF-8");
            getResponse().setContentType("application/octet-stream");
            getResponse().setHeader("Content-Disposition", "attachment; filename=" + fileName);
            out = getResponse().getOutputStream();
            in = new BufferedInputStream(new FileInputStream(path));
            int line;
            while ((line = in.read()) != -1) {
                out.write(line);
            }
        } catch (Exception ex) {
            logger.error("下载文件失败 path=" + path, ex);
        } finally {
            if (null != out) {
                try {
                    out.close();
                } catch (Exception ex) {
                    logger.error("关闭out异常 path=" + path, ex);
                }
            }
            if (null != in) {
                try {
                    in.close();
                } catch (Exception ex) {
                    logger.error("关闭in异常 path=" + path, ex);
                }
            }
        }
    }

js代码[引用博客]

javascript 复制代码
// 通过后端接口下载文件
function downloadFile() {
  // 发起Ajax请求获取文件数据
  $.ajax({
    url: '/download',
    type: 'GET',
    dataType: 'binary',
    success: function(response) {
      // 创建Blob对象
      var blob = new Blob([response]);

      // 创建URL对象
      var url = URL.createObjectURL(blob);

      // 创建a标签并设置相关属性
      var link = document.createElement('a');
      link.href = url;
      link.download = 'file.txt';

      // 触发点击事件进行下载
      link.click();

      // 释放URL对象
      URL.revokeObjectURL(url);
    }
  });
}

json

controller

java 复制代码
public Result execute() throws Exception {
		Result result = new Result();
		result.setErr_no(0);
		try {
			String xlsBase64 = xlsToBase64(param.getAbsDownPath(filePath);
			DataRow dr = new DataRow();
			dr.set("fileName",param.getFileName()+".xlsx");
			dr.set("fileBase64Str",xlsBase64);
			result.setResult(dr);
		}catch (Exception ex){
			result.setErr_no(-99);
			result.setErr_info("系统错误");
			logger.error("模板下载异常", ex);
		}
		return result;
}

protected  String xlsToBase64(String path){
        File file = new File(path);
        if (!file.exists()) {
            logger.error("下载的文件模板不存在 path=" + path );
            return null;
        }
        try{
            return Base64Util.encodeBase64String(FileUtils.readFileToByteArray(file));
        }catch (Exception e){
            logger.error("xls文件转Base64失败 path=" + path, e);
        }
        return null;
    }

javascript 【引用博客】

javascript 复制代码
var raw = window.atob(data.result.fileBase64Str);
var uInt8Array = new Uint8Array(raw.length);
for (var i = 0; i < raw.length; i++) {
  uInt8Array[i] = raw.charCodeAt(i);
}

const link = document.createElement("a");
const blob = new Blob([uInt8Array],{
   type: 'application/vnd.ms-excel'
})

link.style.display = 'none';
link.href = URL.createObjectURL(blob);
link.setAttribute('download',data.result.fileName+'.xls');

document.body.appendChild(link)
link.click()

document.body.removeChild(link)
相关推荐
陌上花开࿈26 分钟前
调用第三方接口
java
Aileen_0v034 分钟前
【玩转OCR | 腾讯云智能结构化OCR在图像增强与发票识别中的应用实践】
android·java·人工智能·云计算·ocr·腾讯云·玩转腾讯云ocr
桂月二二2 小时前
Java与容器化:如何使用Docker和Kubernetes优化Java应用的部署
java·docker·kubernetes
liuxin334455663 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全
小马爱打代码3 小时前
设计模式详解(建造者模式)
java·设计模式·建造者模式
栗子~~3 小时前
idea 8年使用整理
java·ide·intellij-idea
2301_801483694 小时前
Maven核心概念
java·maven
Q_19284999064 小时前
基于Spring Boot的电影售票系统
java·spring boot·后端
我要学编程(ಥ_ಥ)5 小时前
初始JavaEE篇 —— 网络原理---传输层协议:深入理解UDP/TCP
java·网络·tcp/ip·udp·java-ee
就爱学编程5 小时前
重生之我在异世界学编程之C语言:数据在内存中的存储篇(下)
java·服务器·c语言