我的任务是使用java webapp更改2个php页面,该文件将上传pdf文件写入clob并在用户请求下载时读取它。
我将pdf作为字节数组进行了威胁,并且能够正确地读/写
最大的问题是向后兼容性:php编写的文件不能被我的java webapp读取,反之亦然
提前感谢您的帮助
注意:不要回答我使用Blob,我知道这是一种简单的方法,但在这种情况下我们必须假设由于向后兼容性我们无法在db上创建一个alter table
这是我将clob读入字节数组的代码:
byte[] result = null;
InputStream is = null;
ByteArrayOutputStream bos = null;
//...prepare the query to get clob as first column in the resultset
ResultSet rs = stmt.executeQuery();
int len;
int size = 1024;
byte[] buf;
if(rs.next()) {
is = rs.getBinaryStream(1);
bos = new ByteArrayOutputStream();
buf = new byte[size];
while ((len = is.read(buf, 0, size)) != -1)
bos.write(buf, 0, len);
bos.flush();
bos.close();
is.close();
result = bos.toByteArray();
}
rs.close();
这是将字节数组写入clob的代码:
//...some other sql stuff here...
stmt = conn.prepareStatement("SELECT clob_col FROM my_table WHERE prim_key = ? FOR UPDATE");
stmt.setString(1, param);
ResultSet rs = stmt.executeQuery();
Clob myclob=null;
if(rs.next())
myclob=rs.getClob(1);
OutputStream writer = myclob.setAsciiStream(1L);
writer.write(allegato);
writer.flush();
writer.close();
stmt = conn.prepareStatement("UPDATE my_table SET clob_col = ? WHERE prim_key = ? ");
stmt.setClob(1, myclob);
stmt.setString(2, param);
stmt.executeUpdate();
oracle编码是ITALIAN_ITALY.WE8ISO8859P1 php编码是ITALIAN_ITALY.UTF8
答案 0 :(得分:0)
可能的解决方案: 写入clob字节数组的十六进制表示,并在读取阶段执行相同的操作
主要优势是 - php和java中几乎没有变化 - 没有更改db(alter table) - 独立于db编码
在php中我们使用bin2hex和hex2bin函数编写之前和读取clob之后在java中我们实现了2个简单的bin2hex和hex2bin等效函数:
public static byte[] HexToBin(String str){
try{
byte[] result=new byte[str.length()/2];
for (int i = 0; i < result.length; i++)
result[i]=(byte) Integer.parseInt(str.substring(2*i, (2*i)+2), 16);
return result;
}catch(Exception x){
x.printStackTrace();
return null;
}
}
public static String BinToHex(byte[] b){
try{
StringBuffer sb=new StringBuffer();
for (byte bb:b) {
String hexStr = String.format("%02x", bb);
sb.append((hexStr.length()<2)?"0":"");
sb.append(hexStr);
}
return sb.toString();
}catch(Exception x){
x.printStackTrace();
return null;
}
}