随笔-95  评论-31  文章-10  trackbacks-0
问题:
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 朔望魔刃 阅读(461) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: