Используя Java, я загружаю изображение в postgres. Размер БД составляет 4000. Но когда я загружаю его, размер составляет 8000 - PullRequest
2 голосов
/ 07 октября 2010

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

Я использую Postgres DB, и я создал столбец с именем file с типом данных bytea.Изображение действительно загружается в базу данных (я вижу его там, когда я просматриваю данные таблицы).

Я пробовал это с несколькими изображениями.Размер кажется правильным при загрузке, но при загрузке он удваивается.(что разрушает изображение).

Любая помощь в том, почему это не работает, очень ценится.

public void uploadImage(File image, String imageName) throws SQLException {     
    try {
        conn = connectionManager.ConnectToDb();

        String sql = "INSERT INTO images (name, file) "+ "VALUES(?,?)";
        System.out.println("your image name is " + imageName);
        System.out.println("Uploaded image name is " + image);      

        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.setString(1,imageName);

        fis = new  FileInputStream(image);
        stmt.setBinaryStream(2, fis, (int) image.length());

        System.out.println("Image SIZE = " +image.length());

        stmt.execute(); 
        conn.commit();

    } catch (SQLException e) {
        System.out.println("Could not insert into DB");
        e.printStackTrace();        
    } catch (FileNotFoundException e) {
            System.out.println("Could not insert into DB");
            e.printStackTrace();
    } 
     finally {
        //close DB Objects
        try {
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        conn.close();
    }
}

public void downloadImageFromDB(String imagename) throws SQLException
{
    ConnectionManager connectionManager = new ConnectionManager();

    try {
        conn = connectionManager.ConnectToDb();
        Statement downloadImageStatement = conn.createStatement();
        downloadImageStatement.executeQuery("SELECT file FROM images WHERE name = '"+imagename+"'");
        ResultSet rs = downloadImageStatement.getResultSet();
        int i=1;
        InputStream in = null;
        int returnValue = 0;

        if(rs.next())
        {
            String len1 = rs.getString("file");
            int len = len1.length();
            byte [] b = new byte[len];
            in = rs.getBinaryStream("file");
            int index = in.read(b, 0, len);
            OutputStream outImej = new FileOutputStream("C:\\EclipseProjects\\StrutsHelloWorld\\"+imagename+".JPG");

            while (index != -1)
            {
            outImej.write(b, 0, index);
            index = in.read(b, 0, len);
            System.out.println("==========================");
            System.out.println(index);
            System.out.println(outImej);
            System.out.println("==========================");
            }
            outImej.close();
        }else
            {
            returnValue = 1;
            }

        downloadImageStatement.close();
        conn.close();

    } catch (SQLException e) {
        System.out.println("Could not get image from DB");
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    finally
    {
      // close db objects.
        conn.close();
    }
    //return imgData;
}

Ответы [ 3 ]

4 голосов
/ 07 октября 2010

Вы храните свои двоичные данные в текстовом поле Unicode.Измените столбец file на двоичный, и он должен работать.

3 голосов
/ 07 октября 2010

Вы не хотите использовать InputStream.available() для измерения его размера. Вот вопросы и ответы , которые описывают то, что на самом деле делает available() - короче говоря, не так много, что полезно.

Один (правильный) способ получить фактический размер - проверить размер File после того, как вы написали ему, используя File.length().

1 голос
/ 22 января 2011

Я использовал последнюю версию драйвера JDBC, и проблема была решена.Я использую PostgreSQL 9.0.2 и драйвер JDBC4 9.0-801.

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