【问题标题】:Java - Storing image as a Blob in JavaDBJava - 在 JavaDB 中将图像存储为 Blob
【发布时间】:2013-04-17 04:56:14
【问题描述】:

我正在尝试将图像插入数据库,但得到以下信息:

java.sql.SQLDataException:试图从“java.io.InputStream(ASCII)”类型的数据值中获取“BLOB”类型的数据值。

我在数据库中使用 blob。

我是这样插入的:

package javaapplication16;
import com.sun.rowset.CachedRowSetImpl;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sql.rowset.CachedRowSet;

public class JavaApplication16 {

    public static void main(String[] args) throws FileNotFoundException {
        try {
            String driver = "org.apache.derby.jdbc.EmbeddedDriver";
            try {
                try {
                    Class.forName(driver).newInstance();
                } catch (InstantiationException ex) {
                    Logger.getLogger(JavaApplication16.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IllegalAccessException ex) {
                    Logger.getLogger(JavaApplication16.class.getName()).log(Level.SEVERE, null, ex);
                }
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(JavaApplication16.class.getName()).log(Level.SEVERE, null, ex);
            }

            CachedRowSet crs = null;
            crs = new CachedRowSetImpl();
            crs.setUrl("jdbc:derby:derbyDB; create = true");
            crs.setUsername("x");
            crs.setPassword("x");
            crs.setCommand("drop table tbl");
            crs.execute();
            crs.setCommand("CREATE TABLE tbl (ID blob)");
            crs.execute();
            File f = new File("/images/exam_gif_to_png.gif");
            crs.setCommand("insert into tbl (id) values (?)");
            FileInputStream fin = new FileInputStream(f);
            crs.setBinaryStream(1, fin, (int) f.length());
            crs.execute();
        } catch (SQLException ex) {
            Logger.getLogger(JavaApplication16.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

顺便说一句,关于只存储图像的路径,问题是我希望用户能够向我发送图像并将它们存储在一个文件中,我不确定如何解决这个问题有多个具有相同名称的图像,重命名会是一个好的简单的解决方案吗?

【问题讨论】:

  • 确保索引 5 引用正确的参数。他们是 1 索引!此外,available() 仅返回估计值!
  • 我对索引很确定
  • " 重命名会是一个好的简单的解决方案吗?"您应该使用自己的命名方案存储图像,并将“原始名称”与指向文件的指针一起存储在数据库中。

标签: java image jdbc blob javadb


【解决方案1】:

试试这个:

File f = new File(imagePath);
FileInputStream fin = new FileInputStream(f);
crs.setBinaryStream(5, fin, (int) f.length());

编辑---编辑

试试这个:

我认为您的问题是您没有传播更改。

在每个命令后调用acceptChanges()

crs.setCommand("drop table tbl");
crs.execute();
crs.acceptChanges();

crs.setCommand("CREATE TABLE tbl (ID blob)");
crs.execute();
crs.acceptChanges();

crs.setBinaryStream(1, fin, (int) f.length());
crs.execute();
crs.acceptChanges();

【讨论】:

  • 添加了你提到的。得到 crs.acceptChanges(); 行的这个异常;创建表后完成: com.sun.rowset.internal.CachedRowSetWriter.initSQLStatements(CachedRowSetWriter.java:1064) 处 com.sun.rowset.internal.CachedRowSetWriter.writeData(CachedRowSetWriter) 的线程“主”java.lang.NullPointerException 中的异常.java:300) 在 com.sun.rowset.CachedRowSetImpl.acceptChanges(CachedRowSetImpl.java:880) 在 javaapplication16.JavaApplication16.main(JavaApplication16.java:41) Java 结果:1
猜你喜欢
  • 1970-01-01
  • 2010-12-26
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 2015-10-16
相关资源
最近更新 更多