/**
* 文件下载
*
* @param filePath
* 下载文件的完整路径
* @param response
* 响应对象
* @throws IOException
*/
public static boolean download(HttpServletRequest request, String filePath,String file,String fileType, HttpServletResponse response) {
// 将服务器上的文件写入本地文件
OutputStream outputStream = null;
// 读取服务器上的文件信息
InputStream inputStream = null;
// 文件名,输出到用户的下载对话框
String fileName = null;
try {
if (filePath.lastIndexOf("/") != -1) {
fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
} else if (filePath.lastIndexOf("\\") != -1) {
fileName = filePath.substring(filePath.lastIndexOf("\\") + 1);
}
fileName = file +"."+fileType;
// 从文件完整路径中提取文件名,转码是防止中文不能正确显示
if (request.getHeader("User-Agent").contains("firefox")==true) {
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");// firefox浏览器
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName+"\"");
} else if (request.getHeader("User-Agent").contains("MSIE")==true) {
fileName = URLEncoder.encode(fileName, "UTF-8");// IE浏览器
fileName = StringUtils.replace(fileName, "+", "%20");//替换空格
response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName));
}else{
String name = fileName;
if(name.indexOf("Android") == -1){
iosViewFile(request, response, filePath, name, fileType);
}else{
String userAgent = request.getHeader("User-Agent");
byte[] bytes = userAgent.contains("MSIE") ? name.getBytes() : name.getBytes("UTF-8"); // name.getBytes("UTF-8")处理safari的乱码问题
name = new String(bytes, "ISO-8859-1"); // 各浏览器基本都支持ISO编码
response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", name));
}
}
if(fileName.indexOf("iPhone") == -1){
inputStream = new FileInputStream(filePath);
response.setContentType("text/plain");
response.setHeader("Location", fileName);
outputStream = response.getOutputStream();
byte[] buffer = new byte[1024];
int i = -1;
while ((i = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, i);
}
}
} catch (Exception e) {
log.error("下载失败", e);
return false;
} finally {
try {
if (outputStream != null) {
outputStream.flush();
outputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
log.error("关闭流失败", e);
}
}
return true;
}
/**
* IOS在线阅览文档
* @param request 请求
* @param response 响应
* @param fileFullPath 文件路径
* @param attachName 文件名称
* @param fileType 文件类型
* @param ret
*/
private static void iosViewFile(HttpServletRequest request, HttpServletResponse response, String fileFullPath, String attachName, String fileType) {
File file = new File(fileFullPath);
if (file.exists() && file.isFile()) {
synchronized(file){
OutputStream outPutStream = null;
InputStream inputStream = null;
BufferedInputStream buff = null;
try {
response.reset();
response.setHeader("Content-Disposition", "attachment;fileName=" + new String(attachName.getBytes("utf-8"), "iso-8859-1"));
response.setContentType("application/octet-stream");
response.setContentLength((int) file.length());
inputStream = new FileInputStream(file);
buff = new BufferedInputStream(inputStream);
outPutStream = response.getOutputStream();
byte[] b = new byte[1024];
int len=0;
while ((len = buff.read(b, 0, 1024))>0) {
outPutStream.write(b,0,len);
outPutStream.flush();
}
outPutStream.close();
buff.close();
inputStream.close();
}catch (Exception e) {
log.error("下载文件时发生异常" + e.getMessage() + "附件Id:" + fileFullPath);
} finally {
try {
if (null != outPutStream) {
outPutStream.close();
}
if (null != inputStream) {
inputStream.close();
}
if (null != buff) {
buff.close();
}
} catch (IOException e) {
//e.printStackTrace();
}
}
}
}
}
PC端文件下载及手机端在线阅览
最新推荐文章于 2023-08-14 16:40:30 发布