我将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