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




Используйте кодировку 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%.
Нет необходимости использовать кодировку base64 для хранения в базе данных. BLOB-объекты предназначены для двоичных данных. Накладные расходы на кодирование с использованием base64 совершенно не нужны.
Это пример кода того, как можно записать двоичный файл, такой как документ 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) убедитесь, что эти ресурсы закрыты.
Не могли бы вы предоставить дополнительный контекст? Что вы пробовали до сих пор и с чем боретесь?