public String getRealPath(HttpServletRequest request){
return request.getSession().getServletContext().getRealPath("/");
}
/**
* 通用文件下载方法
* @param request HttpServletRequest
* @param response HttpServletResponse
* @param absoluteFilePath String 文件的绝对路径,如:c:/a/a.txt
* @param fileDownloadName String 自定义文件下载显示的名称
* @param isDeleteAfterDownload boolean 用户下载文件后是否删除服务器的源文件,true删除,其它否
*/
public void downloadFile(HttpServletRequest request, HttpServletResponse response,
String absoluteFilePath, String fileDownloadName, boolean isDeleteAfterDownload){
InputStream is = null;
OutputStream os = null;
File file = null;
try{
logger.info("开始时间:"+System.currentTimeMillis());
file = new File(absoluteFilePath);
if(!file.exists()){
throw new RuntimeException("文件不存在:"+file.getAbsolutePath());
}
is = new BufferedInputStream(new FileInputStream(file));
String suffix = absoluteFilePath.substring(absoluteFilePath.lastIndexOf("."));
if(".xls".equalsIgnoreCase(suffix) || ".xlsx".equalsIgnoreCase(suffix)){
response.setContentType("application/vnd.ms-excel");
}else if(".doc".equalsIgnoreCase(suffix) || ".docx".equalsIgnoreCase(suffix)){
response.setContentType("application/vnd.msword");
}else if(".exe".equalsIgnoreCase(suffix)){
response.setContentType("application/octet-stream");
}else if(".jpe".equalsIgnoreCase(suffix) || ".jpeg".equalsIgnoreCase(suffix) || ".jpg".equalsIgnoreCase(suffix)){
response.setContentType("image/jpeg");
}else if(".png".equalsIgnoreCase(suffix)){
response.setContentType("image/png");
}else if(".gif".equalsIgnoreCase(suffix)){
response.setContentType("image/gif");
}else if(".mp3".equalsIgnoreCase(suffix)){
response.setContentType("audio/x-mpeg");
}else if(".mp4".equalsIgnoreCase(suffix) || ".mpg4".equalsIgnoreCase(suffix)){
response.setContentType("video/mp4");
}else if(".wm".equalsIgnoreCase(suffix)){
response.setContentType("video/x-ms-wm");
}else if(".wmv".equalsIgnoreCase(suffix)){
response.setContentType("audio/x-ms-wmv");
}else if(".rm".equalsIgnoreCase(suffix) || ".rmvb".equalsIgnoreCase(suffix)){
response.setContentType("audio/x-pn-realaudio");
}else if(".xml".equalsIgnoreCase(suffix)){
response.setContentType("text/xml");
}else if(".gz".equalsIgnoreCase(suffix)){
response.setContentType("application/x-gzip");
}else if(".gtar".equalsIgnoreCase(suffix)){
response.setContentType("application/x-gtar");
}else if(".tar".equalsIgnoreCase(suffix) || ".taz".equalsIgnoreCase(suffix)){
response.setContentType("application/x-tar");
}else if(".rar".equalsIgnoreCase(suffix)){
response.setContentType("application/x-rar-compressed");
}else if(".zip".equalsIgnoreCase(suffix)){
response.setContentType("application/zip");
}else{
response.setContentType("multipart/form-data");
}
//处理自定义文件名,如果没有自定义文件名,使用原来的文件名进行下载
if(StringUtils.isBlank(fileDownloadName)){//org.apache.commons.lang.StringUtils
fileDownloadName = file.getName().substring(file.getName().lastIndexOf("."));
}else{
if(fileDownloadName.indexOf(".") > -1){
fileDownloadName = fileDownloadName.substring(fileDownloadName.lastIndexOf("."));
}
}
//文件名编码,解决中文乱码问题
String userAgent = request.getHeader("User-Agent").toLowerCase();
if(userAgent.contains("msie")
|| userAgent.contains("trident")
|| userAgent.contains("like gecko")
|| userAgent.contains("edge")){//IE浏览器
fileDownloadName = URLEncoder.encode(fileDownloadName, "UTF-8");
fileDownloadName = fileDownloadName.replaceAll("\\+", "%20");//处理文件名多余的加号(+)
}else{//其它浏览器
fileDownloadName = new String(fileDownloadName.getBytes("UTF-8"), "ISO-8859-1");
}
response.setCharacterEncoding("UTF-8");
response.addHeader("Content-Disposition", "attachment;filename=\"" + fileDownloadName + suffix + "\"");
response.addHeader("Content-Length", "" + file.length());
os = response.getOutputStream();
byte[] buffer = new byte[1024];
int length = 0;
while((length = is.read(buffer)) > 0){
os.write(buffer, 0, length);
}
logger.info("结束时间:"+System.currentTimeMillis());
}catch(Exception e){
e.printStackTrace();
logger.info("下载文件出错:"+e.getCause());
}finally{
try {
if(os != null){
//os.flush();
os.close();
}
if(is != null){
is.close();
}
if(isDeleteAfterDownload){
if(file != null){
//org.apache.commons.io.FileUtils
FileUtils.deleteQuietly(file);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}