隨筆-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 朔望魔刃 閱讀(623) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 额济纳旗| 长沙县| 界首市| 分宜县| 蒙阴县| 桦川县| 成武县| 巴东县| 镇安县| 岫岩| 曲松县| 安西县| 陕西省| 鄯善县| 石台县| 遂平县| 荔浦县| 扬中市| 宁化县| 五原县| 英吉沙县| 开阳县| 新郑市| 阳高县| 日喀则市| 天全县| 兰溪市| 岗巴县| 高密市| 石阡县| 常熟市| 宜良县| 体育| 郓城县| 涪陵区| 聂拉木县| 库尔勒市| 托克托县| 盈江县| 中江县| 乡城县|