PostgreSQL получает изображение из базы данных - PullRequest
0 голосов
/ 28 апреля 2011

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

"Это можетбыть поврежден или использовать формат файла, который 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 && !conn.isClosed()) {
                conn.close();
            }
        }
    }

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

1 Ответ

3 голосов
/ 28 апреля 2011
while (is.read(buffer) > 0) {

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

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