如何将Java中的图片保存到多个blob中?

Posted

技术标签:

【中文标题】如何将Java中的图片保存到多个blob中?【英文标题】:How to save a picture in Java into Multiple blob? 【发布时间】:2014-05-28 17:34:03 【问题描述】:

正如我在标题中所描述的,我尝试使用InputStream 多次访问图片文件,然后将其保存到 blob 类型数据库,但第二次、第三次等结果为空。这是代码的sn-p:

File image1 = new File("src/template1.png").getAbsoluteFile();
File image2 = new File("src/template2.png").getAbsoluteFile();
InputStream in1 = new FileInputStream(image1);
InputStream in2 = new FileInputStream(image2);
long length1 = image1.length();
long length2 = image2.length();
pstmt.setString(1, jTextField18.getText().toUpperCase());
pstmt.setBlob( 2, in1, length1 );
pstmt.setBlob( 3, in1, length1 );
pstmt.setBlob( 4, in1, length1 );
pstmt.setBlob( 5, in1, length1 );
pstmt.setBlob( 6, in1, length1 );
pstmt.setBlob( 7, in2, length2 );
Pstmt.setBlob( 8, in2, length2 );

那么结果是:

YR/21
[BLOB - 5.6 KiB]
[BLOB - 0 B]
[BLOB - 0 B]
[BLOB - 0 B]
[BLOB - 0 B]
[BLOB - 5.5 KiB]
[BLOB - 0 B]

我尝试像这段代码一样使用新的InputStream,但发生了另一个错误。它说: 行大小太大 (>8126)。将某些列更改为 TEXT 或 BLOB 或使用 ROW_FORMAT=DINAMIC 或 ROW_FORMAT=COMPRESSED 可能会有所帮助。在当前行格式中,768 字节的 BLOB 前缀是内联存储的。

pstmt.setBlob( 2, in1, length1 );
image1 = new File("src/template1.png").getAbsoluteFile();
in1 = new FileInputStream(image1);
pstmt.setBlob( 3, in1, length1 );
image1 = new File("src/template1.png").getAbsoluteFile();
in1 = new FileInputStream(image1);
pstmt.setBlob( 4, in1, length1 );

我认为问题得到了解答,并变成了另一个问题。谢谢你的回答

【问题讨论】:

@kdgregory: 这应该是一个答案 【参考方案1】:

第一次调用消耗流,随后的调用没有数据。每次调用都需要一个单独的 InputStream。

【讨论】:

我尝试使用另一个输入流但它仍然无法读取相同的文件,结果仍然是 [BLOB - 0 B] 对不起,我给出了一个误导性的答案,我尝试使用另一个输入流,然后发生了一些错误。它说:行大小太大(> 8126)。将某些列更改为 TEXT 或 BLOB 或使用 ROW_FORMAT=DINAMIC 或 ROW_FORMAT=COMPRESSED 可能会有所帮助。在当前行格式中,768 字节的 BLOB 前缀被内联存储@jtahlborn【参考方案2】:

“有没有办法将一张图片保存到多个 blob 中?”

是的,但您的代码仅适用于小图像。取而代之的是,有一个图像的父引用和一个实际图像的子引用,其中将包含 blob。让孩子们变小,每个人只保存一小块图像。

这将帮助您管理空间并且更容易备份。

有关如何分块读取文件的参考,请查看此处:http://www.javapractices.com/topic/TopicAction.do?Id=245

使用读取文件的while循环将图像块保存到数据库中。

保存文件可能是一个冗长的操作,因此您可以在父级上设置一个标志来定义子级是否全部加载。从而防止其他线程读取不完整的图像。

如果你使用 mysql,有这个关于如何读写图像的教程:http://zetcode.com/db/mysqljava/

玩得开心。

【讨论】:

我想你误解了我的问题,抱歉我的模棱两可,我想说的是我想在多个 blob 中保存一张图片,1 blob 1 图片,就像 blob 1 中的 a.jpg , a.jpg 在 blob 2 中,以此类推,所以同一张图片在不同的 blob 中 好的,在这种情况下,您必须关闭流并重新打开它...或使用非阻塞 IO,但我认为准备好的语句不能与非阻塞一起使用. ...在一个单独的主题上,如果您将图像仅保存到一个 Blob 并引用第一个 Blob,则您的代码可以工作。它将为您节省大量数据库空间。但我并不是要改变你的要求。感谢您的澄清。

以上是关于如何将Java中的图片保存到多个blob中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将图片存到数据库中

用JAVA怎样将保存在数据库BLOB类型的图片取出来转换为图片然后在页面展示啊

android 如何获取保存的图片的地址 并存到数据库中

asp.net中如何保存图片对象

如何在oracle中的blob字段下读取jpg格式文件保存

Java 保存图片到数据库时,为啥要对图片进行base64编码