开发者

Using Java, I upload an image to postgres DB size is 4000. But when I download it, the size is 8000

Here is the latest code. I wanted to try something different but I am still getting the same results.

I am using postgres DB and I created a column called file with a data type bytea. The image does get uploaded to the DB (I can see it in there when I view the table's data).

I tried it with several images. The size appears to be correct when I upload it but then it doubles in size when I download it. (which breaks the image).

Any help on why this is not working is greatly appreciated.

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();
    } 
    finall开发者_开发知识库y
    {
      // close db objects.
        conn.close();
    }
    //return imgData;
}


You are storing your binary data into a Unicode text field. Change your file column to binary and it should work.


You don't want to use InputStream.available() to measure its size. Here's a Q&A that describes what available() actually does - in short, not much that's useful.

One (correct) way to get the actual size is to check the size of the File after you've written to it, using File.length().


I used the latest version of JDBC driver and the problem was solved. I am using PostgreSQL 9.0.2 and the JDBC4 driver 9.0-801.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜