問題:
1: 以jar方式main方法運行嵌入式web容器
2: 每次重啟,會在/tmp/tomcat下面生成不同的context目錄,這樣會導致每次訪問之前上傳的文件失敗

解決思路:
1: 把上傳文件放到非上下文目錄,比如E:\\tomcat 或者/home/test/upload
2: 把這個目錄作為spring-boot的靜態資源目錄
3: 就可以通過鏈接訪問http://xxxx:8080/app/static/1.img
實現:
1: 一般情況,會用如下代碼獲取上下文路徑:
String path = request.getSession().getServletContext().getRealPath(File.separator);
2: 然后在該path下面創建static或者resources目錄,放入上傳文件,直接鏈接訪問http://xxxx:8080/app/static/1.img 即可
3: 但這種方式,會出現上述問題,部署重啟后,會丟失之前上傳的文件,因為是在上下文路徑都變了。
最終實現:
1: 在application-dev.properties里面
# mvc配置
file.upload.path=E:\\upload-files
# 默認所有路徑
spring.mvc.static-path-pattern=/**
# 增加file:${file.upload.path} 表示磁盤路徑為靜態資源路徑
spring.resources.static-locations=classpath:/META-INF/resources/, classpath:/resources/,classpath:/static/, classpath:/public/,file:${file.upload.path}
2: 在代碼里面 @Value("${file.upload.path}")
private String uploadPath ;
/**
* 獲取上傳的圖片地址
* @param multipartFiles 多文件實體
* @return json路徑
*/
public String getPhotoPaths(HttpServletRequest request, MultipartFile[] multipartFiles, String accountId,String fileType){
List<String> imageResult = Lists.newArrayList();
//獲取當前web根路徑
// String path = request.getSession().getServletContext().getRealPath(File.separator);
LOGGER.info("當前path:"+uploadPath);
String currentDate = DateFormatUtils.format(new Date(),"yyyMMddHHmmss");
//文件磁盤路徑
String imageDirectory = uploadPath.concat(File.separator)
.concat("static").concat(File.separator)
.concat("images").concat(File.separator)
.concat(accountId).concat(File.separator)
.concat(fileType).concat(File.separator)
.concat(currentDate);
//創建上傳的磁盤路徑
FileUtils.createDirectory(imageDirectory);
//文件相對路徑
String imageRelativeDirectory = StringUtils.substring(imageDirectory,imageDirectory.indexOf("static"),imageDirectory.length());
for(MultipartFile multipartFile : multipartFiles){
try {
String fileName = multipartFile.getOriginalFilename();
String fileNameWithPath = imageDirectory.concat(File.separator).concat(fileName);
multipartFile.transferTo(new File(fileNameWithPath));
String fileNameWithRelativePath = imageRelativeDirectory.concat(File.separator).concat(fileName);
imageResult.add(fileNameWithRelativePath);
} catch (IOException e) {
LOGGER.error("上傳文件失敗 {}", e.getMessage() );
}
}
return jsonMapper.toJson(imageResult);
}
3: 然后直接訪問http://xxxx:8080/static/images/123/1.img
4: 需要注意這里的/static/images/123相對路徑要唯一,否則會被classpath下面的static目錄下相同文件所覆蓋。
完!
posted on 2017-11-08 14:31
朔望魔刃 閱讀(619)
評論(0) 編輯 收藏 所屬分類:
java