使用Java将映像上载到MySql数据库

时间:2015-05-26 00:09:26

标签: java mysql image maven

我已经阅读了有关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中。我很困惑应该如何处理这个问题。将图像从文件上传到数据库的正确方法应该是什么。我不是要求用户上传任何内容,而只是从数据库中获取图像并在点击链接时将其显示给用户。任何帮助表示赞赏。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我不明白你的问题是什么。

您已阅读建议,使用模式将图像存储为数据库中的BLOB。而是将图像作为文件存储在文件系统上。要在图像文件和数据库行之间建立“链接”,我们创建一个类似

的列
 image_file_location  VARCHAR(255)

然后在该列中存储文件位置,即文件系统上图像文件位置的字符串表示。通常,这是相对于配置文件中指定的目录的相对位置。

 INSERT INTO mytable (..., image_file_location) VALUES (..., '/images/1984.jpg'); 

使用这种方法,不需要将图像(图像文件的内容)存储在数据库的BLOB列中。

这种方法有一些缺点:数据库不管理图像文件。这些将需要与数据库分开备份,并且该备份可能与数据库不完全一致。

此外,某些其他进程可能会重命名或删除图像文件,而无需更新数据库。这将导致不一致,数据库中的一行引用不存在的图像文件。

这种方法的好处是数据库较小,无需编写插入/更新BLOB数据的程序。

但问题中的代码似乎并未遵循该模式。代码似乎是加载图像(从文件中读取),存储在BLOB列中。

如果要将图像拉回,则需要反转用于加载BLOB的过程。运行查询,获取BLOB列的句柄,使用流阅读器“读取”BLOB的内容。

有很多这样做的例子。

同样,我不确定你在问什么问题。