Загрузить файл (pdf, JPEG / FIF) в mysql с помощью java

Есть ли способ прикрепить файл к mysql в java? Мне нужно, чтобы файл находился в базе данных, а не в пути.

Не могли бы вы предоставить дополнительный контекст? Что вы пробовали до сих пор и с чем боретесь?

Nico Haase 31.07.2018 09:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
346
2

Ответы 2

Используйте кодировку base64 и сохраните как данные BLOB

Это пример кодировки:

/**
 * Method used for encode the file to base64 binary format
 * @param file
 * @return encoded file format
 */
private String encodeFileToBase64Binary(File file){
    String encodedfile = null;
    try {
        FileInputStream fileInputStreamReader = new FileInputStream(file);
        byte[] bytes = new byte[(int)file.length()];
        fileInputStreamReader.read(bytes);
        encodedfile = Base64.encodeBase64(bytes).toString();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return encodedfile;
}

Base64 обычно увеличивает размер файла на 20-30%.

Leonardo Roese 31.07.2018 05:40

Нет необходимости использовать кодировку base64 для хранения в базе данных. BLOB-объекты предназначены для двоичных данных. Накладные расходы на кодирование с использованием base64 совершенно не нужны.

Mark Rotteveel 31.07.2018 17:02

Это пример кода того, как можно записать двоичный файл, такой как документ PDF, электронная таблица MS Excel, файл изображения JPG / PNG или файл ZIP и т. д., В столбец таблицы базы данных типа BLOB и читать из базы данных. .

Я использовал их с Java SE 7 или выше с базами данных Apache Derby (также известными как Java DB) и MySQL соответственно.

Дерби:Напишите в db:

Path path = Paths.get("MyPic.jpg");
InputStream instream = Files.newInputStream(path);
PreparedStatement pstmnt = getConnection().prepareStatement(dml); // dml is an sql Insert   
pstmnt.setBinaryStream(1, instream);
// pstmnt.setNull(1, Types.BLOB); // to set null value in db
pstmnt.executeUpdate();
pstmnt.close();
instream.close();

Читать из db:

PreparedStatement pstmnt = getConnection().prepareStatement(sql); // sql is a Select
ResultSet rs = pstmnt.executeQuery();
rs.next();
InputStream instream = rs.getBinaryStream("col_name");
Path path = Paths.get("MyPic.jpg");
OutputStream outstream = Files.newOutputStream(path);
int len = 0;
byte [] buf = new byte [1024];
while ((len = instream.read(buf)) > 0) {
    outstream.write(buf, 0, len);
}
instream.close();
outstream.flush();
outstream.close();      
pstmnt.close();


MySQL:Напишите в db:

PreparedStatement pstmnt_= conn.prepareStatement(DML) // sql Insert
InputStream instream = Files.newInputStream(filePath); // filePath is of type Path
pstmnt.setBinaryStream(1, instream);
pstmnt.executeUpdate();
// close resources here

Читать из db:

PreparedStatement pstmnt = conn.prepareStatement(DML); // sql Select
ResultSet rs = pstmnt.executeQuery();
rs.next();
Blob blob = rs.getBlob("col_name");
long len = blob.length();
byte [] fileBytes = blob.getBytes(1L, (int) len); // start pos = 1L
OutputStream out = ...
out.write(fileBytes);
out.flush();
out.close();

Обратите внимание, что после использования объектов JDBC (например, PreparedStatement) и файловых потоков io (например, InputStream) убедитесь, что эти ресурсы закрыты.

Другие вопросы по теме