PostgreSQL получает изображение из базы данных

#java #postgresql #blob

#java #postgresql #большой двоичный объект

Вопрос:

У меня есть некоторый Java-код, который получает изображение из базы данных и сохраняет его в файл, однако, когда я открываю его во всех программах, кроме Photoshop, я получаю ошибку, похожую на:

«Возможно, он поврежден или использует формат файла, который Preview не распознает». — Это изображение из preview на MAC. База данных, из которой я извлекаю данные, — PostgreSQL, а столбец — bytea.

Мой код выглядит следующим образом:

 public static void main(String[] args) throws Exception {
        Connection conn = null;
        try {
            conn = ConnectionManager.getConnection();

            String sql = "SELECT content from asset ";
            PreparedStatement stmt = conn.prepareStatement(sql);
            ResultSet resultSet = stmt.executeQuery();
            while (resultSet.next()) {

                File image = new File("/Users/esklein/testing" UUID.randomUUID() ".jpg");
                FileOutputStream fos = new FileOutputStream(image);

                byte[] buffer = new byte[256];

                //
                // Get the binary stream of our BLOB data
                //
                InputStream is = resultSet.getBinaryStream("content");
                while (is.read(buffer) > 0) {
                    fos.write(buffer);
                }

                fos.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (conn != null amp;amp; !conn.isClosed()) {
                conn.close();
            }
        }
    }
  

Есть идеи, почему это не выдает изображение, которое можно открыть в любом файле? Спасибо

Комментарии:

1. Вы уверены, что изображение в формате jpg? Photoshop может открыть его, потому что он достаточно умен, чтобы проверять формат файла на тип, а не полагаться на расширение, как большинство программ просмотра изображений. Кроме этого, вы можете получать мусор в конце вашего файла, если не очищаете свой буфер после каждой записи. Что происходит, когда на последних итерациях считывается менее 256 байт? Оставшиеся байты от предыдущего чтения могут все еще находиться в буфере и записываться как мусор в конце файла. Опять же, photoshop может быть достаточно умен, чтобы игнорировать это там, где другие зрители не могут.

2. 1. Вы уверены, что это файл JPEG? посмотрите на первые байты, они должны содержать строку «JFIF» 2. Можете ли вы проверить, совпадает ли размер файла с длиной данных в базе данных? select octet_length(...)

Ответ №1:

 while (is.read(buffer) > 0) {
  

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

 fos.write(buffer, 0, bytesRead)