【问题标题】:Placing InputStream into BufferedOutputStream for upload into Blob将 InputStream 放入 BufferedOutputStream 以上传到 Blob
【发布时间】:2013-11-09 02:58:29
【问题描述】:

我有一个 InputStream,我知道它是一个 PDF,我需要用它来更新 Oracle 中的 Blob。如何将此流转换为 BufferedOutputStream,或者使用此流信息更新 Blob?

请注意,由于代码的限制,我不允许在我的代码中包装 Oracle 类。

到目前为止我已经尝试过:

我已经尝试使用这个答案:https://stackoverflow.com/a/1574857/2188082 连接流,但结果是 NullPointerError,因为 OutputStream 是空的。

我正在尝试运行的当前查询:

pstmt = dbConn.prepareStatement("UPDATE "+ qualTable("document")+" set document_blob ="
                   +" utl_raw.cast_to_raw('"+inStream+"') where document_id = " + documentId);

       pstmt.execute();
       pstmt.close();

我知道 utl_raw.cast_to_raw 可能不是调用 inStream 读取的正确 oracle 方法,不幸的是我并不像我希望的那样精通 Oracle,所以我不知道正确的演员表我应该使用。

【问题讨论】:

  • 您已经在评论我的代码以将数据从一个流复制到另一个流 - 请在您的问题中包含您迄今为止尝试过的内容。

标签: java oracle inputstream outputstream


【解决方案1】:

PreparedStatement.setBlob(parameterIndex, inputStream, length).

像 setString 和其他 setter 一样。没有 OutputStream,但需要一个长度。

【讨论】:

  • parameterIndex 会是数据库中的位置吗?另外,我需要执行这个语句,还是按原样工作?
  • 没关系,rolfl 提醒我,我需要包含一个 ?在我的 PreparedStatement 中使其成为参数。谢谢你。 :)
【解决方案2】:

执行此操作的典型方法是创建一个byte[] 数组并使用它来传输数据:

byte[] buffer = new byte[4096]; // 4K buffer...
int len = 0;
while ((len = input.read(buffer)) >= 0) {
   output.write(buffer, 0, len);
}
output.flush();

这会将每个循环中的一些字节从输入复制到输出,直到输入用完为止。

缓冲区的大小是一个可调参数,您应该在您的环境中对其进行测试,看看哪种效果最好。

【讨论】:

  • 不幸的是,由于输出流是空的,这给我返回了一个空错误。
  • 我看到你的问题暗示了这一点。两件事:正如 Joop 建议的那样,使用位置准备好的语句(在创建准备好的语句时,请参阅? 参数),并找出为什么输出流为空/关闭,它不应该是。
  • 您的提醒包括 ?参数节省了一天。谢谢你们俩。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 2017-02-07
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
相关资源
最近更新 更多