Невозможно удалить изображение, которое используется другим процессом - PullRequest
0 голосов
/ 15 октября 2018

я начал использовать библиотеку thumbnailator , чтобы сделать миниатюру в проекте Spring Boot. Но, когда я пытаюсь удалить файл, я сталкиваюсь с проблемой, у меня возникла исключительная ситуация, сообщающая, что файл используетсядругой процесс.Я довольно новичок в Java и не могу понять, откуда может возникнуть проблема и какой процесс мне следует остановить / закрыть:

File originalFile = mediaUtils.saveFile(pathOriginal, file);

String path = mediaUtils.resolvePath(imageDir, name, false, image.getCreation());
mediaUtils.saveJPG(originalFile, file.getContentType(), WIDTH_IMAGE_SIZE, path);

String pathThumb = mediaUtils.resolvePath(imageDir, name, true, image.getCreation());
mediaUtils.saveJPG(originalFile, file.getContentType(), WIDTH_IMAGE_SIZE_THUMB, pathThumb);

public File saveFile(String filePath, MultipartFile file) {
try {
  Path path = Paths.get(getPath(filePath));
  Files.createDirectories(path.getParent());

  Files.copy(file.getInputStream(), path);

  return new File(path.toString());

} catch (IOException e) {
  LOG.error("could not save file", e);
  throw new FileException("could not create file: " + getPath(filePath), e);
}
}

private void saveJPG(InputStream imageInputStream, File file, String contentType, int newWidth, String outputPath) {
try {
  // verify it is an image
  if (!Arrays.asList("image/png", "image/jpeg").contains(contentType)) {
    throw new IllegalArgumentException("The file provided is not a valid image or is not supported (should be png or jpeg): " + contentType);
  }

  // Create input image
  BufferedImage inputImage = ImageIO.read(imageInputStream);
  newWidth = newWidth > inputImage.getWidth() ? inputImage.getWidth() : newWidth;
  double ratio = (double) inputImage.getWidth() / (double) inputImage.getHeight();
  int  scaledHeight = (int) (newWidth / ratio);

  Path path = Paths.get(baseUrl + outputPath + ".jpg");

  Thumbnails.of(file)
    .size(newWidth, scaledHeight)
    .toFile(path.toFile());

  LOG.info("writing image to {}", path);

} catch (IOException e) {
  LOG.error("could not write image", e);
}
}

Спасибо за любой совет или помощь:)

1 Ответ

0 голосов
/ 15 октября 2018

Вы должны обязательно закрыть свои входные потоки и файлы после того, как вы их использовали.В противном случае такие вещи, как вы упомянули, случаются.Процесс блокирует ваш файл.

Поэтому вместо использования простых блоков try-catch я бы порекомендовал использовать try-with-resources, который закроет основные потоки и файлы.Например:

try(InputStream imageInputStream = new FileInputStream(...)) {
    // do your stuff
}

После выполнения кода в скобках или возникновения исключения входной поток будет закрыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...