java 文件下载预览_javaweb简单的实现文件下载及预览

@ResponseBody

@RequestMapping(value="/downloadFile")public void downloadFile(HttpServletRequest request, HttpServletResponse response) throwsException{//解决乱码问题

String path = request.getParameter("path");

String fileName= request.getParameter("fileName");

path=MyUtils.isRandomCode(path);

fileName=MyUtils.isRandomCode(fileName);try{

String filePath= path+fileName;//高速浏览器以附件形式下载//不同浏览器的编码不同,对中文进行编码,下载时输出名称是文件名

response.setHeader("Content-Disposition","attachment;filename="+fileName);//获取文件的mimetype,如123.txt,他的mimetype就是 txt ,下载时,就以 txt 格式下载

String mimeType = fileName.substring(fileName.lastIndexOf(".") + 1); //获取文件后缀,比如是 txt 文件,就是以txt格式下载//设置响应的 mimetype

response.setContentType(mimeType);//获取response 输出流,用来输出文件

ServletOutputStream out =response.getOutputStream();//接下来进行读取,以输入流的形式读取

FileInputStream in = newFileInputStream(filePath);byte[] buffer = new byte[1024];int len = 0;while ((len=in.read(buffer))!=-1){

out.write(buffer,0,len);

}

in.close();

}catch(Exception e) {

System.out.println("下载错误!");

}

}

这里有一个工具类,就是前端传过来的参数有可能会乱码,所以要判断一下是否乱码,有乱码的话就处理一下

packagecom.zhouhe.modules.api.util;importjava.io.UnsupportedEncodingException;/*** 自定义工具类

* @Author zhouhe

* @Date 2019/11/15 11:54*/

public classMyUtils {/*** 判断是否是乱码,乱码的话进行处理,不乱码直接返回

*@paramcode

*@return

*/

public static String isRandomCode(String code) throwsUnsupportedEncodingException {if (!XUtil.isEmpty(code)) {//判断是乱码 (GBK包含全部中文字符;UTF-8则包含全世界所有国家需要用到的字符。)

if (!(java.nio.charset.Charset.forName("GBK").newEncoder().canEncode(code))) {

code= new String(code.getBytes("ISO-8859-1"), "utf-8"); //转码UTF8

}

}returncode;

}

}

前端可以使用 window.location.href=请求路径,比如:

38c21f6383a2ec8ddb7e4085a4280204.png

1d7b1e41d71f4973427373ce149ca6d8.png

注意:

不能使用ajax请求后台下载文件,否则会有问题:

ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,ajax没法解析后台返回的文件流,所以无法处理二进制流response输出来下载文件,可以在浏览器中的network里面查看访问的地址,找到response一栏就看见 后台返回的数据:

2be45b23ece120bb4a27172223ba188f.png

解决方法:

文件直接下载(不需要传递参数),可以使用 < a href="/media">点击下载Excel < /a>

前端需要传递参数(如excel),可以在绑定方法里面 window.location.href=url

文件预览:

public void downLoad(String filePath, HttpServletResponse response, boolean isOnLine) throwsException {

File f= newFile(filePath);if (!f.exists()) {

response.sendError(404, "File not found!");return;

}

BufferedInputStream br= new BufferedInputStream(newFileInputStream(f));byte[] buf = new byte[1024];int len = 0;

response.reset();//非常重要

if (isOnLine) { //在线打开方式

URL u = new URL("file:///" +filePath);

response.setContentType(u.openConnection().getContentType());

response.setHeader("Content-Disposition", "inline; filename=" +f.getName());//文件名应该编码成UTF-8

} else { //纯下载方式

response.setContentType("application/x-msdownload");

response.setHeader("Content-Disposition", "attachment; filename=" +f.getName());

}

OutputStream out=response.getOutputStream();while ((len = br.read(buf)) > 0)

out.write(buf,0, len);

br.close();

out.close();

}

要注意在路径前加了file:///,否则会报错 java.net.MalformedURLException: unknown protocol: e

还有一点就是中文下载或者带空格的话可能会有问题,会出现中文乱码或者变成___,而空格会被截断,处理方式如下:

response.setHeader("Content-Disposition","attachment;filename="+fileName);

换成

response.setHeader("Content-Disposition","attachment; filename=\"" + new String(fileName.getBytes("gb2312"),"ISO-8859-1") + "\"");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值