import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.StringUtils;
/**
* 返回文件流到浏览器
*/
public class ResponseFileUtil {
/**
* 返回前台文件流进行展示
*
* @param filePath 要返回的文件具体路径
* @param contentType 例如:"image/png"
* @param response
*/
public static void responseFileForShow(String filePath, String contentType, HttpServletResponse response)
throws Exception {
ResponseFileUtil.responseFile(filePath, contentType, false, response);
}
/**
* 返回前台文件流进行下载
*
* @param filePath 要返回的文件具体路径
* @param contentType 例如:"application/x-download;charset=utf-8"
* @param response
*/
public static void responseFileForLoad(String filePath, String contentType, HttpServletResponse response)
throws Exception {
ResponseFileUtil.responseFile(filePath, contentType, true, response);
}
/**
* 使用response返回文件流
*
* @param filePath 要返回的文件具体路径
* @param contentType contentType类型
* 例如:"application/x-download;charset=utf-8"
* 例如:"image/png"
* @param isLoad true时下载,false时展示
* @param response 借助response进行流的返回
*/
public static void responseFile(String filePath, String contentType, boolean isLoad, HttpServletResponse response)
throws Exception {
// 声明工具类
BufferedInputStream in = null;
BufferedOutputStream out = null;
try {
// 若路径为空
if (StringUtils.isEmpty(filePath)) {
throw new Exception("invalid filepath of null.");
}
// 没找到文件
File file = new File(filePath);
if (!file.exists()) {
throw new Exception("file not exist in path [" + filePath + "]");
}
// 输出文件流到浏览器
in = new BufferedInputStream(new FileInputStream(filePath));
out = new BufferedOutputStream(response.getOutputStream());
// 设置MineType类型
response.setContentType(contentType);
// 如果是下载,指定文件名称
if (isLoad) {
String fileName = file.getName(); // 获取文件名
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
}
byte[] buffer = new byte[8192];
int count = 0;
while ((count = in.read(buffer, 0, 8192)) != -1) {
out.write(buffer, 0, count);
}
out.flush();
file = null;
} catch (Exception e) {
throw e;
} finally {
// 关闭输入输出流
closeStream(in, out);
}
}
/**
* 关闭输入输出流
*/
public static void closeStream(InputStream in, OutputStream out) {
if (null != in) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != out) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}