使用HttpClient实现跨服务图片下载

需求:

由于web系统存放图片的文件夹路径和erp系统存放图片的文件夹路径不一样

所以

web系统文件上传的文件要拷贝到erp对应的文件夹

思路:

在erp中访问图片接口的时候,如果图片不存在,则调web系统的访问图片接口,把图片保存到erp指定的文件夹

ERP代码:

@RequestMapping(value = { "/viewImg2/{fileName:.+}" })
  public void viewImg(@PathVariable String fileName, final HttpServletResponse request,
      final HttpServletResponse response) throws Exception {
    String ext = StringUtils.substringAfterLast(fileName, ".");
    String pre = StringUtils.substringBeforeLast(fileName, ".");
    String path = saveFilePath + "\\" + fileName;

    logger.debug(path);
    File file = new File(path);
    if (!file.exists()) {
      // 获取web系统上传的图片
      CloseableHttpClient httpClient = HttpClients.createDefault();
      String[] arrayStr = fileName.split("\\.");
      String url = remotePath + "/api/upload/viewImg/" + arrayStr[1] + "/" + arrayStr[0];
      HttpGet httpGet = new HttpGet(url);
      httpGet.setHeader("token", remoteToken);
      // 设置超时时间
      RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(60000).setConnectTimeout(50000).build();
      httpGet.setConfig(requestConfig);
      CloseableHttpResponse res = httpClient.execute(httpGet);
      if (res.getStatusLine().getStatusCode() == 200) {
        // 得到实体
        HttpEntity entity = res.getEntity();
        byte[] data = EntityUtils.toByteArray(entity);
        // 图片存入磁盘
        FileOutputStream fos = new FileOutputStream(path);//path为完整路径
        fos.write(data);
        fos.close();
        httpClient.close();

      } else {
        return;
      }

    }

    if (file.length() > 1024 * 1024 * 2) { // 大于1M,缩小50%
      File tmpFile = new File(saveFilePath + "\\" + pre + "-scale." + ext);
      if (!tmpFile.exists()) {
        Thumbnails.of(file).scale(0.5).toFile(tmpFile);
        file = new File(saveFilePath + "\\" + pre + "-scale." + ext);
      } else {
        file = tmpFile;
      }
    }
    BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));
    byte[] buf = new byte[1024];
    int len = 0;
    response.reset(); // 非常重要
    if ("gif".equalsIgnoreCase(ext)) {
      response.setContentType(GIF);
    } else if ("bmp".equalsIgnoreCase(ext)) {
      response.setContentType(BMP);
    } else if ("png".equalsIgnoreCase(ext)) {
      response.setContentType(PNG);
    } else {
      response.setContentType(JPG);
    }
    OutputStream out = response.getOutputStream();
    while ((len = br.read(buf)) > 0) {
      out.write(buf, 0, len);
    }
    br.close();
    out.close();
  }

web系统代码:

@RequestMapping(value = { "/viewImg/{ext}/{fileName}" })
  public void viewImg(@PathVariable String fileName, @PathVariable String ext, final HttpServletResponse request,
      final HttpServletResponse response) throws Exception {
    if (StringUtils.isNotEmpty(ext)) {
      fileName += "." + ext;
    }
    String path = saveFilePath + "\\" + fileName;
    logger.debug(path);
    File file = new File(path);
    if (!file.exists()) {
      return;
    }

    response.reset(); // 非常重要
    if ("gif".equalsIgnoreCase(ext)) {
      response.setContentType(GIF);
    } else if ("bmp".equalsIgnoreCase(ext)) {
      response.setContentType(BMP);
    } else if ("png".equalsIgnoreCase(ext)) {
      response.setContentType(PNG);
    } else {
      response.setContentType(JPG);
    }
    OutputStream out = response.getOutputStream();
    IOUtils.write(FileUtils.readFileToByteArray(file), out);
  }

总结:

1.调其他项目的接口时,要把文件放到api文件夹中

2.调用web的接口的时候,要在请求头中加token

猜你喜欢

转载自blog.csdn.net/xiao297328/article/details/83659343