Springboot jarパッケージのファイルの取得とファイルのダウンロード機能
5177 ワード
シーン:springbootはjarパッケージとして打って、クラスの中でjarパッケージの中/static/***を取得します。pdfファイル
ローカルテストは問題なく、パスは全く問題ありませんが、サーバの起動パスには感嘆符が付いています.理由が分かりません.知っている仲間がいれば、一言残してもいいですよ.
感嘆符の問題かと思ったら、replaceが落ちても始まらない.
// /applications/xxx.jar!/BOOT-INF/classes!/ -- --
File path = new File(ResourceUtils.getURL("classpath:").getPath());
File file = new File(path + "/static/" + fileName + ".pdf");
fis = new FileInputStream(file);
response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
IOUtils.copy(fis, response.getOutputStream());
response.flushBuffer();
次の方法に変更すればOKです.fileを取得する必要はありません.inputstreamを取得すればいいです.
@RequestMapping(value = "/download/{fileName}")
public void downloadFile(@PathVariable String fileName, HttpServletRequest request, HttpServletResponse response) {
response.setCharacterEncoding(request.getCharacterEncoding());
response.setContentType("application/octet-stream");
FileInputStream fis = null;
try {
ClassPathResource classPathResource = new ClassPathResource("static/" + fileName + ".pdf");
InputStream inputStream = classPathResource.getInputStream();
try {
IOUtils.copy(inputStream, response.getOutputStream());
response.flushBuffer();
} finally {
IOUtils.closeQuietly(inputStream);
}
/*File path = new File(ResourceUtils.getURL("classpath:").getPath());
File file = new File(path + "/static/" + fileName + ".pdf");
fis = new FileInputStream(file);
response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
IOUtils.copy(fis, response.getOutputStream());
response.flushBuffer();*/
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
この方式は私达のプロジェクトの中で使うことができなくて、ただ别のプロジェクトを见て记录を使って、最も良いデータファイルとjarパッケージは别で、ファイルの経路をjarの****に配置します.propertiesでは、ファイルを読み取る方法がより良いです.
次のコードは、固定テンプレートのダウンロードにのみ適用されます.
1、テンプレートパスをjarパッケージ以外のフォルダの下に配置する
2、プロファイルの読み込み
3、中国語のファイル名のダウンロードをサポートできる
@Value("${urldate.importModel}")
private String importModel;
/**
*
*
* @return
*/
@RequestMapping(value = "/downImportModelFile", produces = "application/json")
@ResponseBody
public Result downImportModelFile(HttpServletRequest request, HttpServletResponse response) {
Result result = downFile(importModel, request, response);
return result;
}
/**
*
*
* @param filePath
* @return
*/
public Result downFile(String filePath, HttpServletRequest request, HttpServletResponse response) {
InputStream fis = null;
OutputStream toClient = null;
File file = new File(filePath);
if(!file.exists()){
return Result.error("file exists");
}
try {
// 。
fis = new BufferedInputStream(new FileInputStream(filePath));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
// Response
setResponse(request,response,file);
toClient = new BufferedOutputStream(response.getOutputStream());
toClient.write(buffer);
return null;
} catch (Exception e) {
e.printStackTrace();
return Result.error();
} finally {
try {
if (null != fis) {
IOUtils.closeQuietly(fis);
}
if (null != toClient) {
toClient.flush();
IOUtils.closeQuietly(toClient);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* response
* @param request
* @param response
* @param file
*/
public void setResponse(HttpServletRequest request,HttpServletResponse response,File file) {
ServletContext sc = request.getSession().getServletContext();
String fileName = file.getName();
String filePath = file.getPath();
// response
response.reset();
// response Header
// response.setHeader("Content-Disposition",
// "attachment;filename="+ new String(fileName.getBytes(),"ISO8859-1"));
response.setHeader("Content-Disposition","attachment;filename*=UTF-8''"+ URLEncoder.encode(fileName));
response.addHeader("Content-Length", "" + file.length());
response.setContentType(sc.getMimeType(filePath));
}