在我的JavaFX应用程序中,我想保存和检索图像文件. 但我找不到解决办法. 我try 了很多种解决方案. 但我找不到解决办法. 在这些解决方案中,我可以保存图像文件,但无法在ImageView中检索和显示. 未显示错误.但我找不到解决办法. 我不知道哪里出了错. 因此,请研究我的图像保存代码和检索代码,并帮助解决这个问题. 提前谢谢你.

This is my Show Image Code

private void showImage(String id) {
        Image img = null;
        try {
            PreparedStatement pst = db.con.prepareStatement("select image from " + db.schema + ".tbl_user where code = ?");
            pst.setString(1, id);
            ResultSet rs = pst.executeQuery();
            if (rs.next()) {
                Blob image = rs.getBlob("image");
                InputStream imgFile = image.getBinaryStream();
                img = new Image(imgFile) ;
                imgFile.close();
                imgView.setFitHeight(120);
                imgView.setFitWidth(120);
                imgView.isSmooth();
                imgView.setImage(img);
                lblPic.setText("");
            } else {
                lblPic.setText("Photo");
            }
        } catch (Exception e) {
            Alert alt = new Alert(Alert.AlertType.ERROR,e.getMessage(),ButtonType.OK);
            alt.show();
            throw new RuntimeException(e);
        }
    }

This How I select the Image to Save.

 FileChooser chooser = new FileChooser();
 FileChooser.ExtensionFilter extFilterJPG = new FileChooser.ExtensionFilter("JPG files (*.jpg)", "*.JPG","*.JPEG","*.jpeg");
 FileChooser.ExtensionFilter extFilterPNG = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.PNG");
 chooser.getExtensionFilters().addAll(extFilterJPG, extFilterPNG);
 File file = chooser.showOpenDialog(stage_Emp);
   if(file != null){
      Image image = new Image(file.toURI().toString());
      imgView.setFitHeight(120);
      imgView.setFitWidth(120);
      imgView.isSmooth();
      imgView.setImage(image);
      img_path=file.getAbsolutePath();
   }

And This is How I save the Image

 FileInputStream fis = new FileInputStream(img_path);
 PreparedStatement pst = db.con.prepareStatement("UPDATE "+db.schema+".tbl_user SET image=? Where code=?");
 pst.setBinaryStream(1,fis,(int)img_path.length());
 pst.setString(2, txtID.getText());
 pst.executeUpdate();

推荐答案

问题似乎出在您将数据写入数据库的方式上.

既然你在做(出于某种未知的原因)

imgPath = file.getAbsolutePath();

imgPath必须是String(文件绝对路径的字符串表示形式).那么这样做就没有意义了

pst.setBinaryStream(1,fis,(int)imgPath.length());

that method call的第三个参数应该是流中的字节数,而不是文件名中的字符数.

如果你这么做了

Image image = new Image(file.toURI().toString());

然后

FileInputStream fis = new FileInputStream(file);
PreparedStatement pst = db.con.prepareStatement("UPDATE "+db.schema+".tbl_user SET image=? Where code=?");
pst.setBinaryStream(1,fis,file.length());
pst.setString(2, txtID.getText());
pst.executeUpdate();    

(获取文件的长度,而不是文件名的长度)它应该可以工作.根本不需要知道文件的名称.

然而,无论如何都不需要获得文件的长度.只要让它读到文件流的末尾.此外,由于您在数据库中使用的是BLOB字段,您还可以这样做

pst.setBlob(1, fis);

这可能比pst.setBinaryStream(...)的效率略高一些.

加载图像时,可以使用以下命令判断错误

if (img.isError()) {
    img.getException().printStackTrace();
}

以查看加载图像时是否引发异常的堆栈跟踪.

Mysql相关问答推荐

完全相同的A B表达在SQL中的不同上下文中意外返回不同的结果

MySQL 8.0.28覆盖(和函数)索引未使用

SQL:创建新列并将现有表中的值追加到新创建的列中

错误 2020 (HY000): 数据包大于 'max_allowed_pa​​cket' 字节,docker 容器内出现 mysql 错误

使用mysql查询获取不关注user1的user3

如何从mysql中的不可用日期范围获取可用日期范围?

如何找到每个user_id每个产品的买家类型数量?

错误1075:表定义不正确;只能有一个自动列,它必须定义为一个键(使用 gorm 和 mysql)

最后一个字母 '%n' 的 mysql SELECT 字符串不起作用

检索按键列值分组的最新日期 (MySql)

将 Go var 传递给 MySQL - try 在 Go lang 程序 (MySQL db) 中执行 db.Exec 时出错

根据单个日期字段获取范围/天数

由于长时间操作而断开连接后,我的 sql 查询是否继续执行?

mySQL 中的主数据库和 IF 错误?

MYSQL如何将虚拟列添加到现有表中

如何使用 phpmyadmin 复制数据库?

在 MySQL Workbench EER 图中的多个列上创建唯一约束

我应该使用什么列数据类型来存储大量文本或 html

SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合

SQL WHERE 列 = 一切