153 lines
5.8 KiB
Java
153 lines
5.8 KiB
Java
|
|
package com.mesasoft.cn.util;
|
|||
|
|
|
|||
|
|
import cn.hutool.core.io.FileUtil;
|
|||
|
|
import cn.hutool.core.io.IoUtil;
|
|||
|
|
import cn.hutool.core.text.UnicodeUtil;
|
|||
|
|
import com.alibaba.fastjson.JSONObject;
|
|||
|
|
import com.mesasoft.cn.modules.constant.DefaultValues;
|
|||
|
|
import com.zhazhapan.util.Checker;
|
|||
|
|
import org.apache.commons.lang3.StringUtils;
|
|||
|
|
|
|||
|
|
import javax.activation.MimetypesFileTypeMap;
|
|||
|
|
import javax.servlet.ServletOutputStream;
|
|||
|
|
import javax.servlet.http.HttpServletRequest;
|
|||
|
|
import javax.servlet.http.HttpServletResponse;
|
|||
|
|
import java.io.*;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @author pantao
|
|||
|
|
* @since 2018/1/30
|
|||
|
|
*/
|
|||
|
|
public class ControllerUtils {
|
|||
|
|
|
|||
|
|
private ControllerUtils() {
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取一个简单的响应状态
|
|||
|
|
*
|
|||
|
|
* @param isSuccess 是否操作成功
|
|||
|
|
* @return 响应JSON字符串
|
|||
|
|
*/
|
|||
|
|
public static String getResponse(boolean isSuccess) {
|
|||
|
|
JSONObject jsonObject = new JSONObject();
|
|||
|
|
if (isSuccess) {
|
|||
|
|
jsonObject.put("status", "success");
|
|||
|
|
} else {
|
|||
|
|
jsonObject.put("status", "error");
|
|||
|
|
}
|
|||
|
|
return jsonObject.toString();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 加载本地资源
|
|||
|
|
*
|
|||
|
|
* @param response 返回的Response
|
|||
|
|
* @param path 资源路径
|
|||
|
|
* @param download 直接下载
|
|||
|
|
*/
|
|||
|
|
public static void loadResource2(HttpServletResponse response, String path, boolean download) throws IOException {
|
|||
|
|
if (Checker.isNotEmpty(path)) {
|
|||
|
|
File file = new File(path);
|
|||
|
|
if (download) {
|
|||
|
|
response.setContentType(getContentType(file)+";charset=UTF-8");
|
|||
|
|
setResponseFileName2(response, file.getName());
|
|||
|
|
}
|
|||
|
|
FileInputStream in = new FileInputStream(file);
|
|||
|
|
ServletOutputStream os = response.getOutputStream();
|
|||
|
|
byte[] b;
|
|||
|
|
while (in.available() > 0) {
|
|||
|
|
b = in.available() > 1024 ? new byte[1024] : new byte[in.available()];
|
|||
|
|
in.read(b, 0, b.length);
|
|||
|
|
os.write(b, 0, b.length);
|
|||
|
|
}
|
|||
|
|
in.close();
|
|||
|
|
os.flush();
|
|||
|
|
os.close();
|
|||
|
|
} else {
|
|||
|
|
response.sendRedirect(DefaultValues.NOT_FOUND_PAGE);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public static void loadResource(HttpServletResponse response, String path, boolean download) throws IOException {
|
|||
|
|
if (Checker.isNotEmpty(path)) {
|
|||
|
|
File file = new File(path);
|
|||
|
|
if (download) {
|
|||
|
|
response.setContentType(getContentType(file));
|
|||
|
|
setResponseFileName( response, file.getName());
|
|||
|
|
response.setCharacterEncoding("UTF-8");
|
|||
|
|
}
|
|||
|
|
FileInputStream in = new FileInputStream(file);
|
|||
|
|
ServletOutputStream os = response.getOutputStream();
|
|||
|
|
byte[] b;
|
|||
|
|
while (in.available() > 0) {
|
|||
|
|
b = in.available() > 1024 ? new byte[1024] : new byte[in.available()];
|
|||
|
|
in.read(b, 0, b.length);
|
|||
|
|
os.write(b, 0, b.length);
|
|||
|
|
}
|
|||
|
|
in.close();
|
|||
|
|
os.flush();
|
|||
|
|
os.close();
|
|||
|
|
} else {
|
|||
|
|
response.sendRedirect(DefaultValues.NOT_FOUND_PAGE);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public static String getContentType(File file) {
|
|||
|
|
String defContentType = "application/octet-stream";
|
|||
|
|
String fileName = file.getName();
|
|||
|
|
String fileTyle=fileName.substring(fileName.lastIndexOf(".")+1,fileName.length());
|
|||
|
|
if (StringUtils.isNotBlank(fileTyle)) {
|
|||
|
|
String type2 = Contants.CONTENT_TYPES.get(fileTyle);
|
|||
|
|
if (StringUtils.isNotBlank(type2)) {
|
|||
|
|
return type2;
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
String type1 = new MimetypesFileTypeMap().getContentType(file);
|
|||
|
|
if (StringUtils.isNotBlank(type1)) {
|
|||
|
|
return type1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return defContentType;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 设置响应头的文件名
|
|||
|
|
*
|
|||
|
|
* @param response {@link HttpServletResponse}
|
|||
|
|
* @param fileName 文件名
|
|||
|
|
*/
|
|||
|
|
public static void setResponseFileName2(HttpServletResponse response, String fileName) {
|
|||
|
|
response.setHeader("Content-Disposition", "attachment;filename=" + UnicodeUtil.toUnicode(fileName));
|
|||
|
|
}
|
|||
|
|
public static void setResponseFileName( HttpServletResponse response, String fileName) throws
|
|||
|
|
UnsupportedEncodingException {
|
|||
|
|
response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("UTF-8"),
|
|||
|
|
"ISO-8859-1"));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void loadFile(HttpServletRequest request, HttpServletResponse response,String filePath,boolean download) throws IOException {
|
|||
|
|
request.setCharacterEncoding("utf-8");
|
|||
|
|
// 文件存储路径
|
|||
|
|
// 从请求中获取文件名
|
|||
|
|
File file=new File(filePath);
|
|||
|
|
String fileName=file.getName();
|
|||
|
|
// 创建输出流对象
|
|||
|
|
ServletOutputStream outputStream = response.getOutputStream();
|
|||
|
|
//以字节数组的形式读取文件
|
|||
|
|
byte[] bytes = FileUtil.readBytes(filePath);
|
|||
|
|
// 设置返回内容格式
|
|||
|
|
response.setContentType("application/octet-stream;charset=UTF-8");
|
|||
|
|
// 把文件名按UTF-8取出并按ISO8859-1编码,保证弹出窗口中的文件名中文不乱码
|
|||
|
|
// 中文不要太多,最多支持17个中文,因为header有150个字节限制。
|
|||
|
|
response.setHeader("filename", UnicodeUtil.toUnicode(fileName));
|
|||
|
|
// 这一步一定要在读取文件之后进行,否则文件名会乱码,找不到文件
|
|||
|
|
fileName = new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
|
|||
|
|
// 设置下载弹窗的文件名和格式(文件名要包括名字和文件格式)
|
|||
|
|
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
|
|||
|
|
// 返回数据到输出流对象中
|
|||
|
|
outputStream.write(bytes);
|
|||
|
|
// 关闭流对象
|
|||
|
|
IoUtil.close(outputStream);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|