Java JPA извлекает BLOB-объекты из базы данных Oracle в качестве исходного типа файлов - PullRequest
0 голосов
/ 16 октября 2019

Я использую Java Spring и JPA У меня есть запрос, чтобы получить BLOB-объекты из базы данных Oracle. Я получаю BLOB-объект, и если это текстовый файл, он прекрасно загружается на мой локальный компьютер, но если это изображение, мне нужно пройти через BufferedImage, и я все еще работаю над PDF. Пока что я просто вижу расширение файла, получая его оригинальное имя файла, которое также хранится в БД, и затем фильтруя строку для расширения. Когда я получаю PDF-файл, он говорит, что файл поврежден или открыт в другом окне, а это не так. Пока что это мой код, который пытается превратить BLOB-объект из БД в файл:

  Blob blob = Service.retrieveBlob(ID);
    if (blob == null){
      return false;
    }
    String fileName = Service.getFileName(ID);
    String extension = fileName.substring(fileName.lastIndexOf('.') + 1);
    System.out.println(extension);
    if (extension.equals("jpg") || (extension.equals("png"))){
      File file = new File("./DBPicture.png");
      try(FileOutputStream outputStream = new FileOutputStream(file)) {
        BufferedImage bufferedImage = ImageIO.read(blob.getBinaryStream());
        ImageIO.write(bufferedImage, "png", outputStream);
        System.out.println("Image file location: "+file.getCanonicalPath());
      } catch (IOException e) {
        e.printStackTrace();
      }
}
    else {
      InputStream ins = blob.getBinaryStream();
      byte[] buffer = new byte[ins.available()];
      ins.read(buffer);

      File targetFile = new File("./" + fileName);
      OutputStream outStream = new FileOutputStream(targetFile);
      outStream.write(buffer);
}

1 Ответ

0 голосов
/ 16 октября 2019

available это просто так. это не обязательно длина потока.

Попробуйте что-то вроде

InputStream ins = blob.getBinaryStream();
File targetFile = new File("./" + fileName);
OutputStream outStream = new FileOutputStream(targetFile);

byte[] buffer = new byte[8000];
int count = 0;
while ((count = ins.read(buffer)) != -1) {
    outStream.write(buffer);
}

// then close your output
outStream.close (); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...