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.
精彩评论