2011-04-28 105 views
0

像我有一些Java代碼獲取不過是從數據庫中的圖像並將其保存到一個文件,當我在所有的程序中打開它,但Photoshop中我得到類似的錯誤:的PostgreSQL正從數據庫

「它可能已損壞或使用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(); 
      } 
     } 
    } 

這是爲什麼不隨地吐痰可以在任何文件中打開圖像的任何想法?謝謝

+2

你是積極的圖像是一個JPG? Photoshop可能會打開它,因爲它足夠聰明,可以根據類型檢查文件格式,而不必像大多數圖像查看器那樣依賴擴展名。除此之外,如果您在每次寫入後都未清除緩衝區,則可能會在文件末尾發生垃圾。當最後一次迭代讀取少於256字節時會發生什麼?來自上一次讀取的剩餘字節可能仍然在緩衝區中,並在文件結尾處作爲垃圾寫出。再次,photoshop可能足夠聰明,可以忽略其他觀衆無法看到的地方。 – Jberg 2011-04-28 18:16:12

+0

1.你確定它是一個JPEG文件嗎?看看第一個字節,它應該包含一個「JFIF」字符串 2.你可以測試該文件的大小是否與數據庫中的數據長度相同? 'select octet_length(...)' – leonbloy 2011-04-28 18:17:13

回答

3
while (is.read(buffer) > 0) { 

你假設讀取操作總是填充整個緩衝區。但是,如果數據大小爲1001字節,並且緩衝區大小爲1000字節,則最後一次讀取將只獲得一個字節。你需要檢查實際讀取的字節數,然後

fos.write(buffer, 0, bytesRead) 
+0

+1完全正確 – leonbloy 2011-04-28 18:19:59