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

如何将Java中的图片保存到多个blob中?,java,image,blob,inputstream,fileinputstream,Java,Image,Blob,Inputstream,Fileinputstream,正如我在标题中所描述的,我多次尝试使用InputStream访问图片文件,然后将其保存到blob类型的数据库中,但第二次、第三次等的结果为空。以下是代码片段: File image1 = new File("src/template1.png").getAbsoluteFile(); File image2 = new File("src/template2.png").getAbsoluteFile(); InputStream in1 = new FileInputStream(image1

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

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]
我试图使用new
InputStream
像这样的代码,但发生了另一个错误。它说: 行大小太大(>8126)。将某些列更改为文本或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 );
我认为这个问题已经得到了回答,并变成了另一个问题。感谢您的回答“有没有办法将图片保存到多个blob?”

是的,但您的代码只适用于小图像。取而代之的是,为图像创建一个父引用,为实际图像创建一个子引用,这将包含blob。让孩子们变小,只保存图像的一大块给他们每个人

这将帮助您管理空间,并使备份更容易

有关如何以块形式读取文件的参考,请查看以下内容:

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

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

如果您使用的是MySQL,那么本教程将介绍如何读取和写入图像:


祝您玩得开心。

第一次调用占用了流,而随后的调用没有数据。每次呼叫都需要一个单独的InputStream。

@kdgregory:这应该是一个答案。我试图使用另一个InputStream,但它仍然无法读取相同的文件,结果仍然是[BLOB-0 B]。很抱歉,我给出了一个误导性的答案,我尝试使用另一个InputStream,然后发生了一些错误。它表示:行大小太大(>8126)。将某些列更改为文本或BLOB或使用ROW_FORMAT=DINAMIC或ROW_FORMAT=COMPRESSED可能会有所帮助。在当前的行格式中,768字节的BLOB前缀以内联方式存储@jtahlborn我想你误解了我的问题,抱歉我的歧义,我想说的是我想在多个BLOB中保存一张图片,1个BLOB 1图片,比如BLOB 1中的a.jpg,BLOB 2中的a.jpg,等等,所以相同的图片在不同的BLOB中,在这种情况下,您必须关闭流并重新打开它。。。或者使用非阻塞IO,但我认为准备好的语句不能与非阻塞一起工作。。。在另一个主题中,如果只将图像保存到一个Blob并引用第一个Blob,则代码可以工作。这将为您节省大量的数据库空间。但我不是想改变你的要求。谢谢你的澄清。