问题:
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
朔望魔刃 阅读(610)
评论(0) 编辑 收藏 所属分类:
java