我已经阅读了有关StackOverFlow和其他教程的大量问题,将图像存储在文件中然后将其唯一引用存储在数据库中总是更好。我试图这样做,但我最终做了以下。我创建了一个Maven项目并在src / main / resources文件夹下创建了一个文件夹图像,其中我有三个图像。以下是我的代码:
public class ImageHelper
{
private static final String IMAGE_FILE = "/images/1984.jpg";
Connection conn =null;
Statement statement = null;
PreparedStatement preparedStatement = null;
int byteArrayLength =0;
ConnectionClass newConnection = new ConnectionClass();
InputStream imageStream = null;
int imageFileLength;
//Link reference http://stackoverflow.com/questions/13967307/reading-from-src-main-resources-gives-nullpointerexception
//Link reference http://stackoverflow.com/questions/19916845/cant-access-to-files-in-resources-directory-with-maven-with-eclipse-ide
public void getPath(){
try
{
File imageFile = new File(this.getClass().getResource(IMAGE_FILE).toURI());
//System.out.println("ImageFile is: "+ imageFile.toString()); //Output is the full path starting from C drive till the image
imageFileLength = (int) imageFile.length();
//System.out.println("Image File length : "+ imageFileLength);
imageStream = new FileInputStream(imageFile);
System.out.println("ImageStream is :"+ imageStream.read()); // Output is 255
}
catch (IOException e)
{
e.printStackTrace();
}
catch (URISyntaxException e)
{
e.printStackTrace();
}
//Now insert this image path in table bookInfo in imagePath column
conn = newConnection.dbConnection();
String insertImage = "Insert into bookInfo(availability,isbn,hardback,paperback,imagePath) values (?,?,?,?,?)";
try
{
statement = conn.createStatement();
preparedStatement = conn.prepareStatement(insertImage);
preparedStatement.setString(1, "yes");
preparedStatement.setInt( 2, 97815972);
preparedStatement.setString(3, "hardback");
preparedStatement.setString(4, "not paperback");
preparedStatement.setBinaryStream(5, imageStream, imageFileLength);
preparedStatement.executeUpdate();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
在执行此代码时,我能够将BLOB导入数据库。我不明白只是将图像路径的参考存储在数据库中是什么意思。此外,我在该文件夹中有大约10个图像。我需要将所有这些插入数据库中。我想我正在做一个额外的步骤。我是第一次从文件中获取图像"图像"然后将其转换为InputStream并将其作为BLOB存储在MySql中。我很困惑应该如何处理这个问题。将图像从文件上传到数据库的正确方法应该是什么。我不是要求用户上传任何内容,而只是从数据库中获取图像并在点击链接时将其显示给用户。任何帮助表示赞赏。提前谢谢。
答案 0 :(得分:0)
我不明白你的问题是什么。
您已阅读建议,使用非模式将图像存储为数据库中的BLOB。而是将图像作为文件存储在文件系统上。要在图像文件和数据库行之间建立“链接”,我们创建一个类似
的列 image_file_location VARCHAR(255)
然后在该列中存储文件位置,即文件系统上图像文件位置的字符串表示。通常,这是相对于配置文件中指定的目录的相对位置。
INSERT INTO mytable (..., image_file_location) VALUES (..., '/images/1984.jpg');
使用这种方法,不需要将图像(图像文件的内容)存储在数据库的BLOB列中。
这种方法有一些缺点:数据库不管理图像文件。这些将需要与数据库分开备份,并且该备份可能与数据库不完全一致。
此外,某些其他进程可能会重命名或删除图像文件,而无需更新数据库。这将导致不一致,数据库中的一行引用不存在的图像文件。
这种方法的好处是数据库较小,无需编写插入/更新BLOB数据的程序。
但问题中的代码似乎并未遵循该模式。代码似乎是加载图像(从文件中读取),将存储在BLOB列中。
如果要将图像拉回,则需要反转用于加载BLOB的过程。运行查询,获取BLOB列的句柄,使用流阅读器“读取”BLOB的内容。
有很多这样做的例子。
同样,我不确定你在问什么问题。