问题描述
项目之前被下载的文档是存放在构建后的项目包/{basedir}/manual_file路径下。之后因为项目改为轻门户后端,仅使用jar包方式启动,造成原本的下载文档不可用。对下载文档部分进行了调整,对过程进行一下记录。
原方案
package.xml中配置内容
<fileSet>
<directory>${basedir}/manual_file</directory>
<outputDirectory>manual_file</outputDirectory>
<includes>
<include>*.docx</include>
</includes>
<fileMode>0755</fileMode>
</fileSet>
下载
@Override
public void downloadManual(String projectPath, HttpServletRequest request, HttpServletResponse response) {
String manualPath = StringUtils.join(new String[]{projectPath, "/manual_file/", "test.docx"});
DownloadUtils.downloadByFilePath(manualPath, request, response);
}
下载工具类
package com.changkong.util;
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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownloadUtils {
public static void downloadByFilePath(String path, HttpServletRequest request, HttpServletResponse response) {
downloadFile(new File(path), request, response);
}
public static void downloadFile(File file, HttpServletRequest request, HttpServletResponse response) {
InputStream fis = null;
OutputStream outputStream = null;
try {
// 取得文件名。
String filename = file.getName();
// 取得文件的后缀名。
String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
// 以流的形式下载文件。
fis = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
// 清空response
response.reset();
String realname = filename;
String agent = (String)request.getHeader("USER-AGENT");
if(agent != null && agent.toLowerCase().indexOf("firefox") > 0)//火狐浏览器下采用base64编码
{
realname = "=?UTF-8?B?" + (new String(org.apache.commons.codec.binary.Base64.encodeBase64(realname.getBytes("UTF-8")))) + "?=";
}
else {
realname = URLEncoder.encode(realname, "UTF-8");
}
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" +realname);
response.addHeader("Content-Length", "" + file.length());
outputStream = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
outputStream.write(buffer);
outputStream.flush();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (fis != null ) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
调整后的方案
test.docx当前位置
/src/main/resources/test.docx
下载
@Override
public void downloadManual(HttpServletRequest request, HttpServletResponse response){
try {
InputStream inputStream = LocationUtil.class.getResourceAsStream("/test.docx");
File file = new File("test.docx");
FileUtils.copyInputStreamToFile(inputStream, file);
inputStream.close();
DownloadUtils.downloadFile(file,request,response);
} catch (Exception e) {
log.error("文档不存在:{}", e.getMessage());
}
}