utf-8 oracle clob,在java中写/读pdf?

时间:2015-06-25 17:12:59

标签: java php oracle clob

我的任务是使用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

1 个答案:

答案 0 :(得分:0)

可能的解决方案: 写入clob字节数组的十六进制表示,并在读取阶段执行相同的操作

主要优势是 - php和java中几乎没有变化 - 没有更改db(alter table) - 独立于db编码

在php中我们使用bin2hexhex2bin函数编写之前和读取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;
        }
    }