Pour MySQL:
| TINYBLOB | <= 255 octets (1 octet pour stocker la taille) |
| BLOB | <= 65 535 octets (2 octets pour la taille) |
| MEDIUMBLOB | <= 16 777 215 octets (3 octets pour la taille) |
| LONGBLOB | <= 4 294 967 295 octets (4 octets pour la taille) |
CREATE TABLE image (
name varchar(20) NOT NULL,
img mediumblob,
PRIMARY KEY (name));
Pour PostgreSQL:
BYTEA qui permet de stocker des données binaires allant jusqu'à 1 Go.
CREATE TABLE "public"."image" (
"name" VARCHAR(20) NOT NULL,
"img" BYTEA,
PRIMARY KEY("name")) WITH OIDS;
Côté Java
Les drivers à utiliser :
Pour MySQL: com.mysql.jdbc.Driver
Pour PostgreSQL: org.postgresql.jdbc.Driver
La String chemin correspond au fichier que l'on manipule (le fichier + le chemin complet).
La String nom correspond au nom que l'on veut donner à l'image dans la base.
Je n'ai pas géré les exceptions ou encore fermer les flux pour ne pas alourdir le code.
Comment insérer un BLOB dans la base ?
Connection connection = DriverManager.getConnection("url","user","password");
File monImage = new File(chemin);
FileInputStream stream = new FileInputStream(monImage);
String sql = "INSERT INTO image VALUES (?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, nom);
statement.setBinaryStream(2, stream, (int)file.length());
statement.executeUpdate();
Comment récupérer un BLOB de la base ?
Connection connection = DriverManager.getConnection("url","user","password");
File monImage = new File(chemin);
FileOutputStream ostreamImage = new FileOutputStream(monImage);
String sql = "SELECT img FROM image WHERE name=?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,name);
ResultSet rs = statement.executeQuery();
if(rs.next()) {
InputStream istreamImage = rs.getBinaryStream("img");
byte[] buffer = new byte[1024];
int length = 0;
while((length = istreamImage.read(buffer)) != -1){
ostreamImage.write(buffer, 0, length);
}
}