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;

}

}

}