Sauvegarder un fichier binaire dans une base de données PostGreSql
---------------------------------------------------------------------------------------------------------------------
Script SQL
Créer à l'aide d'un script SQL une table avec une colonne de type bytea pour sauvegarder le fichier dans une chaîne binaire.
--Créer une table dans la base de données pour sauvegarder les fichiers
CREATE TABLE fichiers(nom_fichier character varying(100),fichier bytea);
--Taille de la table avant l'insertation d'un fichier
SELECT pg_size_pretty(pg_total_relation_size('fichiers'));
---------------------------------------------------------------------------------------------------------------------
Code C#
Sauvegarder ou lire un fichier dans la base de données PostGreSql.
using Npgsql;
using System;
using System.Data;
using System.IO;
namespace InsererBlobPostGreSql
{
class Program
{
/// <summary>
/// Sauvegarder et lire un fichier à l'aide d'une chaîne binaire bytea (blob) dans une base de données PostGreSql
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
NpgsqlConnection npgSqlConnection = new NpgsqlConnection("Server=127.0.0.1;Port=5432;Database=PortefeuilleValeurs;Integrated Security=true;");
//Sauvegarder le fichier dans un blob (bytea)
Uri fichierUri = new Uri(".\\Penguins.jpg", UriKind.Relative);
StreamReader streamReader = new StreamReader(fichierUri.OriginalString);
SauvegarderFichierBdd(npgSqlConnection, Path.GetFileName(fichierUri.OriginalString), streamReader.BaseStream);
//Lire le fichier sauvegardé dans un blob (bytea)
Uri fichierSauvegarde = new Uri(".\\penguins_copy.jpg", UriKind.Relative);
StreamWriter streamWriter = new StreamWriter(fichierSauvegarde.OriginalString);
Stream stream = LireFichierBdd(npgSqlConnection, "Penguins.jpg");
stream.Position = 0;
stream.CopyTo(streamWriter.BaseStream);
stream.Close();
streamWriter.Close();
if (npgSqlConnection.State == ConnectionState.Open) npgSqlConnection.Close();
}
/// <summary>
/// Sauvegarder un fichier dans une chaîne binaire (bytea)
/// </summary>
/// <param name="nomFichier"></param>
/// <param name="fichier"></param>
/// <param name="npgSqlConnection" ></param>
static void SauvegarderFichierBdd(NpgsqlConnection npgSqlConnection, string nomFichier, Stream fichier)
{
//Stocker le fichier à sauvegarder dans un tableau d'octets
BinaryReader binaryReader = new BinaryReader(fichier);
fichier.Position = 0;
Byte[] fichierOctets = binaryReader.ReadBytes((int)fichier.Length);
fichier.Close();
//Sauvegarder la chaine binaire dans la base de données
if (npgSqlConnection.State == ConnectionState.Closed) npgSqlConnection.Open();
NpgsqlCommand npgsqlCommand = new NpgsqlCommand("INSERT INTO fichiers(nom_fichier,fichier) VALUES(@nomFichier,@fichier)", npgSqlConnection);
npgsqlCommand.Parameters.AddWithValue("@nomFichier", nomFichier);
npgsqlCommand.Parameters.AddWithValue("@fichier", fichierOctets);
npgsqlCommand.ExecuteNonQuery();
}
/// <summary>
/// Lire un fichier sauvegardée dans une chaîne binaire (bytea)
/// </summary>
/// <param name="npgSqlConnection"></param>
/// <param name="nomFichier"></param>
/// <param name="reportoireSauvegardeFichier" ></param>
/// <returns></returns>
static Stream LireFichierBdd(NpgsqlConnection npgSqlConnection, string nomFichier)
{
Stream fichier = null;
//Récupérer la chaine binaire
if (npgSqlConnection.State == ConnectionState.Closed) npgSqlConnection.Open();
NpgsqlCommand npgsqlCommand = new NpgsqlCommand(" SELECT nom_fichier,fichier FROM fichiers WHERE nom_fichier = @nomFichier ", npgSqlConnection);
npgsqlCommand.Parameters.AddWithValue("@nomFichier", nomFichier);
NpgsqlDataReader npgSqlDataReader = npgsqlCommand.ExecuteReader();
npgSqlDataReader.Read();
byte[] fichierOctets = (byte[])npgSqlDataReader["fichier"];
fichier = new MemoryStream(fichierOctets);
return fichier;
}
}
}