2016-12-28 9 views
3

Для задачи я должен хранить изображение в MySQL как формат blob (хотя было бы лучше и идеально хранить путь изображения в базе данных и сохранить изображение в папке в localcopy).Как сохранить изображение в формате blob для MySQL в Java

До сих пор я исследовал и не мог найти ответ, который мог бы помочь мне, это то, что я сделал до сих пор

Вскоре, как нажатие кнопки, это будет срабатывать:

empdao.insertImage(fis); 

изображения заполняются на другом даже слушатель, как это:

static FileInputStream fis = null; 
static String path = null; 
path = filechooser.getSelectedFile().getAbsolutePath(); 
File image = new File(path); 
fis = new FileInputStream (image); 

Этот код ниже заботится о добавлении его в базу данных.

public void insertImage(FileInputStream fis) throws SQLException { 



Connection c = getConnection();  

    String query = "INSERT INTO Picture (picture) VALUES (?)"; 

    System.out.println(query); 

    PreparedStatement pstmt = c.prepareStatement(query); 

    pstmt.setBinaryStream(1, fis); 

    pstmt.executeUpdate(); 

    c.close(); 
} 

Однако проблема в том, что мне нужно это, чтобы преобразовать его в качестве сгустка, и я не знаю, как, может кто-то помочь мне или направить меня о том, как идти о хранении выбранного изображения в качестве поля двоичных объектов в MySQL.

В настоящее время, когда он добавляет его в базу данных, я получаю входной файл java.io под колонкой изображений.

+0

http://stackoverflow.com/a/41235395/267540 – e4c5

ответ

3

Предположим, у вас есть таблица my_picures в MySQL с id INT PRIMARY KEY, name VARCHAR(255), и photo BLOB.

Затем вы можете использовать следующий Java-код, чтобы вставить новую фотографию в BLOB:

public class InsertPictureAsBlob { 
    public static void main(String[] args) throws Exception, IOException, SQLException { 
     Class.forName("com.mysql.jdbc.Driver"); 
     Connection conn = DriverManager 
      .getConnection("jdbc:mysql://localhost/databaseName", "username", "password"); 
     String INSERT_PICTURE = "INSERT INTO my_picures(id, name, photo) VALUES (?, ?, ?)"; 

     conn.setAutoCommit(false); 
     File file = new File("myPhoto.png"); 
     try (FileInputStream fis = new FileInputStream(file); 
        PreparedStatement ps = conn.prepareStatement(INSERT_PICTURE)) { 
      ps.setString(1, "001"); 
      ps.setString(2, "name"); 
      ps.setBinaryStream(3, fis, (int) file.length()); 
      ps.executeUpdate(); 
      conn.commit(); 
     } 
    } 
} 
+0

Я внес изменения, которые вы предложили, но он по-прежнему не добавляет изображения в базу данных даже с использованием PreparedStatement. –

+0

Спасибо, что это сработало сейчас, потому что я забыл добавить бит размера –

+0

Добро пожаловать. – DimaSan

2

1) Во-первых вы будете хотеть, чтобы убедиться, что у вас есть таблица, созданная в вашей схеме MySQL с Определен тип столбца BLOB (BLOB, MEDIUMBLOB, LONGBLOB). Просмотрите типы столбцов BLOB, доступные в MySQL, и выберите соответствующий размер.

2) Вы захотите переключиться с использования Statement на PreparedStatement.

String query = "INSERT INTO Pictures (Picture) VALUES (?)"; 
PreparedStatement pstmt = conn.prepareStatement(query); 

3) Вы в настоящее время проходит в FileInputStream вашему методу так что вам просто нужно использовать метод setBinaryStream на PreparedStatement.

pstmt.setBinaryStream(1, fis); 

4) Затем выполните executeUpdate() на PreparedStatement.

pstmt.executeUpdate(); 

Использовать обработку исключений у вас есть в исходном коде и выполнить соответствующую очистку объектов (подключение к базе данных, подготовленных операторов), аналогичный тому, что у вас есть в исходном коде.

+0

Есть ли в любом случае я могу использовать регулярное заявление вместо PreparedStatement, так как его задача, и я должен следовать спецификации ??? –

+0

@ jomin_george94 Код, приведенный выше, заключается в том, как вы должны это делать, ваш текущий код, и я не могу поместить какой-либо другой способ, небезопасный мусор, а не как хороший код доступа к базе данных написан на Java.Я не уверен, что вы имеете в виду «должны следовать спецификации», но спецификации обычно описывают, что нужно сделать, а не как это должно быть реализовано. –

+0

Когда я делаю так, как вы предлагали, я получаю NullPointerException и не работает в этой строке: –