我將jpeg圖像插入到我的UTF-8編碼Postgres數據庫到bytea列/ s中。我正在使用準備好的sql語句插入圖像。在聲明中,我在jpeg鏡像中創建了一個文件對象,然後將其作爲FileInputStream傳遞給setBinaryStream方法。但是每一個現在,再次執行該語句我的Java應用程序會拋出異常,指出:Postgres在通過Java插入圖像時編碼「UTF8」錯誤
「錯誤:無效字節序列編碼‘UTF8’:的0x84」
出現這種情況有選擇的幾個圖像這很奇怪。這些圖像是從前一組圖像中提取的,所有先前的圖像都插入了罰款,只有幾個提取的圖像似乎會導致錯誤。那麼我該如何解決這個問題呢?能夠以某種方式將字節流編碼爲UTF-8?或者它是數據庫的問題?
順便說一句,如果我用新的替換提取的圖像,並將它們保存爲JPEG,同樣的錯誤發生。謝謝你的幫助!
其代碼如下要求...
有一些代碼,否則缺少這將會是很長,但是,基本上我做的路徑和目錄名的幾項檢查,以確保他們遵守文件系統規則。這是一個遍歷所有子目錄的循環,並在所有子目錄中添加jpeg文件的所有 。然後我到帶有圖像子目錄的下一個目錄,直到沒有任何圖像。我還沒有添加嘗試捕獲和記錄部分。
String imgStr = image.toString();
int age = getAgeFromDir(imgStr);
String gender = getSexFromDir(imgStr);
String table = "";
switch(validIdx){
case 0: table = "carpals";
break;
case 1: table = "d_phalanges";
break;
case 2: table = "p_phalanges";
break;
case 3: table = "i_phalanges";
break;
case 4: table = "epiphyses";
break;
case 5: table = "sesamoids";
break;
case 6: table = "metacarpals ";
break;
}
PreparedStatement ps = con.prepareCall("INSERT INTO " + table +
" VALUES((SELECT hands.hand_id FROM hands WHERE hands.age = " + age + " AND hands.gender = '" + gender + "' AND hands.location = '" + path + directory + imageNames[i] + "')," +
" (SELECT COUNT(" + table + ".location) FROM " + table + "), " +
" ?, ?)" );
//go through each sub-directory which contains jpeg images and add them to
//the database
File sublist = new File(image + "\\" + subdir[j]);
String[] files = sublist.list();
String[] pics = sublist.list(new JpegFilter());
if(files.length > pics.length){
//WRITE TO LOG
//WARNING UNEXPECTED FILES OR DIRECTORIES FOUND IN....
}
for(int r = 0; r < pics.length; r++){
String location = image + "\\" + subdir[j] + "\\" + pics[r];
System.out.println(i + "\t" + r + " location : " + location);
File f = new File(location);
FileInputStream pic = new FileInputStream(f);
if(f.isFile()){
ps.setString(2, location);
ps.setBinaryStream(1, pic, (int)f.length());
ps.execute();
pic.close();
}
}
ps.close();
}
引發的的SQLException低於,則在ps.execute()拋出:
異常在線程 「主」 org.postgresql.util.PSQLException:錯誤:無效字節序列用於編碼 「UTF8」:的0x84 在org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1608) 在org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1343) 在org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl。的java:194) 在org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451) 在org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350) 在org.postgresql.jdbc2.AbstractJdbc2Statement。執行(AbstractJdbc2Statement.java:343) 在nuffielddb.HandDB.addExtractedImages(HandDB.java:406) 在nuffielddb.Main.main(Main.java:37) Java結果:1
我們能看到你的代碼嗎? – 2009-08-12 14:55:57
顯示打開文件並將其傳遞給JDBC的實際代碼,例外情況也很好看,例如,無論是扼流圈數據庫還是文件讀取失敗的數據庫。 – nos 2009-08-12 15:01:04
你試圖插入圖像的列的類型是什麼?這是否是一次機會? – 2009-08-12 15:35:02