這是最新的代碼。我想嘗試一些不同的東西,但我仍然得到相同的結果。使用Java,我上傳了一個圖像postgres數據庫大小是4000.但是,當我下載它的大小是8000
我正在使用postgres數據庫,我創建了一個名爲文件與數據類型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;
}
圖像表的DDL是什麼樣的? – DerMike 2010-10-07 14:33:24
寫入的文件有多大? ('InputStream.available(...)'有時會返回估計值) – DerMike 2010-10-07 14:37:17
is.available()總是報告的大小是圖像第一個大小的兩倍,還是總是8000?我會用另一張圖片來測試它,看看在這種情況下,不正確的圖像大小恰好是預期大小的兩倍。 – 2010-10-07 14:39:18