Enregistrer des fichiers dans une base de données et les restituer

Description

J'ai fait cette source suite à pas mal de questions sur le forum, pour par exemple comment afficher une image stockée dans une base de données, proposer un zip en telechargement etc...

Comment cela fonctionne ?

il y a une page upload.aspx qui permet comme son nom l'indique d'envoyer vers le serveur des images. Lorsque l'on clique sur le bouton j'ai quelques traitement qui permet de vérifier le type de l'image etc... puis ca va créer un nouveau object Fichier.

cet object Fichier, est une classe que j'ai faites, celui ci ne comporte aucun code, pour bien séparer les couches vous devriez mettre tous les objects de données dans un projet bien définit.

Ensuite une fois que mon object Fichier est créer, j'appelle la méthode AddFile en passant le fichier en paramètre, cette méthode se trouve dans une classe de la couche service qui elle aussi devrait se situer dans un autre projet. Cette méthode envoie le fichier dans la base de données, et renvoie l'id du fichier.

J'ai également une page fichierByID qui prend en paramètre l'id du fichier demandé. Celui ci va se charger d'afficher la requete, pour cela il va faire appel à la méthode GetFileByID de la couche service. une fois notre fichier recupéré, on va pouvoir soit l'afficher directement dans la page, et laisser le navigateur traiter ca, c'est par exemple le cas d'une photo ou un fichier PDF. On pourra également forcé le navigateur à telechargé le fichier, par exemple pour un zip.

c'est cette partie du code qui s'en occupe :

'variable permettant de savoir si on force le telechargement ou pas, on peut par exemple
'afficher directement une image
Dim ForceDownload As Boolean = True

'si le fichier comporte un de ces ContentType
Dim ContentType As String = "jpeg|jpg|png|gif"
For Each s As String In ContentType.Split("|")
If oFichier.ContentType.IndexOf(s) > 0 Then
Response.ContentType = oFichier.ContentType
ForceDownload = False
Exit For
End If
Next

'on regarde si on a trouvé le contentType c'est à dire que c'est le navigateur qui s'occupe du fichier, sinon on force le download
If ForceDownload Then
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" & id & "." & oFichier.Extension)
Response.ContentType = "application/octet-stream"
End If

J'ai fait ce code en utilisant Asp.net 2 il est donc possible que j'ai utilisé des fonctionalités nouvelles, mais normalement j'ai rien utilisé de completement nouveau, juste des petites astuce il sera donc trés facile d'adapter le code pour .net 1

voici le schéma de la base de donnée, il vous faudra donc créer une table et deux procédures pour utiliser mon exemple. Vous pouvez aussi regarder la capture pour voir a quoi ressemble la base de données

'
' Voici la table Table_Fichiers que vous devrez avoir pour utiliser cet exemple
'
'Column Name type Allow null
'-----------------------------------------
'FileID int Unchecked
'Guid nvarchar(50) Unchecked
'ContentType text Unchecked
'Length int Unchecked
'Fichier varbinary(MAX) Unchecked
'Extension nchar(10) Unchecked
'
'
' Voici les deux procédures stockées utilisé pour ajouter et recuperer les données
'
'
'-- GetFileByID ----------------------------------------
'ALTER procedure [dbo].[GetFileByID]
' (
' @FileID int
' )
'as
'
'SELECT Fichier, Length, ContentType, Extension, FileID
'FROM Table_Fichiers
'WHERE FileID = @FileID
'
'
'-- AddFile ---------------------------------------------
'ALTER procedure [dbo].[AddFile]
' (
' @Fichier varbinary(MAX),
' @ContentType text,
' @Length int,
' @Guid char(50),
' @Extension nchar(10)
' )
'as
'
'INSERT INTO Table_Fichiers(Fichier, ContentType, Length, Guid, Extension)
'VALUES (@Fichier, @ContentType, @Length, @Guid, @Extension)
'
' -- permet de recuperer l'id de l'element qu'on vient de rajouter
'SELECT FileID FROM Table_Fichiers WHERE Guid = @Guid
'

Je tient à préciser que je connais trés peu SQL, mon code doit surement etre optimisable, si vous avez des suggestions dites le moi

Source / Exemple :


Il y a dans le zip 6 fichiers. Une image de la structure de la base de données (SQL 2005 dans mon cas, mais cela devrait fonctionner avec SQL 2000), une page de code comprenant 2 classes, ainsi que 2 pages avec les fichiers de code behind associé

Conclusion :


Vous avez pu remarquer que j'ai mis une GUID dans la base de données. vous pourrez vous servir de ceci en créant par exemple une nouvelle procédure stockée, une page FichierByGuid.aspx ceci est utile dans le cas ou voulez un peu de confidentialité, en effet il est trés aisé de recuperer un autre fichier contenu dans la bdd, en utilisant une guid cela sera plus compliqué, ceci ne procurera bien sur pas une confidentialité absolue, trés loin de la meme, mais ce sera un premier pas.

j'ai commenté le code je pense suffisament, si toutefois vous avez des problèmes besoin d'explication, dites le moi. N'hésitez pas non plus à me dire si vous avez des suggestions, bugs etc...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.