2010-03-11 27 views

回答

3

只要把它作爲InputStream和使用PreparedStatement#setBinaryStream()來存儲它。它是二進制數據,而不是字符數據,所以Reader只會弄亂一些東西,你不想擁有。

一言以蔽之:

InputStream input = imageUrl.openStream(); 

// ... 

statement = connection.prepareStatement("INSERT INTO image (content) VALUES (?)"); 
statement.setBinaryStream(1, input); 
statement.executeUpdate(); 

一個PreparedStatement是真正有用的。它不僅可以從SQL injections節省您的時間,還可以簡化在SQL語句中設置像InputStream這樣的全功能Java對象。您可以通過JDBC tutorial瞭解更多關於PreparedStatement的信息。

+0

謝謝,我正在使用InputStream取得更多進展,但是,由於我使用Google App Engine,因此需要將Blob存儲到對象中的屬性。你能否澄清我如何將InputStream轉換爲Blob? – Lloyd 2010-03-11 15:29:31

+0

你爲什麼?只需使用'PreparedStatement#setBinaryStream()'將InputStream存儲到數據庫blob字段中並使用ResultSet#getBinaryStream()從DB blob字段中檢索InputStream。不需要爲'java.sql.Blob'或類似Java代碼中的緊密耦合而煩惱。 – BalusC 2010-03-11 15:39:23

+0

感謝您的幫助,我錯過的一小段是 byte [] theBytes = new byte [input.available()]; input.read(theBytes); – Lloyd 2010-03-11 15:42:03

0

對於圖像,不是逐行讀取緩衝區,而是將其加載到字節數組中,並將該字節數組保存爲blob。

+0

這也是可能的,它只有可能比使用'InputStream'更多的內存佔用。 – BalusC 2010-03-11 15:12:17

3

那麼我做什麼來存儲二進制數據,如圖像,很簡單。在我的情況下,我處理上傳到servlet的文件。在servlet內部,我使用request.getInputStream()獲取了發佈主體上的InputStream。但是,這可以與任何類型的InputStreawm一起使用,包括基於URL的輸入。下面的示例代碼顯示瞭如何將該InputStream轉換爲Google appeninge Blob,然後您可以在數據存儲中使其持久化。

... 
import org.apache.commons.io.IOUtils; 
import com.google.appengine.api.datastore.Blob; 
... 

public void InputStreamToBlob(InputStream i) throws IOException { 

    ... 

    Blob content = new Blob(IOUtils.toByteArray(i)); 
    ... 
相關問題