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

Soyez le premier à donner votre avis sur cette source.

Vue 47 604 fois - Téléchargée 3 648 fois

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

Ajouter un commentaire

Commentaires

sebmafate
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
30 -
et en plus... c'est beau ;)
Azraelinou
Messages postés
16
Date d'inscription
mercredi 12 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2008
-
Salut,

je dois dire que ta source m'a été trés utile, mais m'initiant à l'ASP ou plutot à web developpement, tu trouveras peut etre ma question stupide...

j'explique: apres avoir inseré, et donc rappelé l'image stockée dans ma BDD, je cherche maintenant a ne l'afficher que dans un contexte particulier en en l'occurence dans une balise (
ou ) pour faire en sorte que l'image puisse etre adaptée a son contenu et/ou son conteneur (exemple news avec une image en haut a gauche et le texte qui suit son orientation.

ce pourrait il que quelqu'un me montre comment m'y appliquer?

merci d'avance.

Johan
armand19841984
Messages postés
3
Date d'inscription
samedi 3 février 2007
Statut
Membre
Dernière intervention
31 mai 2008
-
ton code il est bien je cherchais a le faire justement mais bon tout est déja fait MERCI!! Mais le probleme moi jaime codé en C# et non en VB donc je vais tous traduire LOL sinon si tu la en C# ,fait nous signe
armand19841984
Messages postés
3
Date d'inscription
samedi 3 février 2007
Statut
Membre
Dernière intervention
31 mai 2008
-
jai un pb avec ton code il me met comme erreur
"Type 'FichierBDD' et 'Fichier' non défini"
tu peux mexpliquer l'erreur stp!!!

merci
DONYONE
Messages postés
4
Date d'inscription
mardi 3 octobre 2006
Statut
Membre
Dernière intervention
30 juin 2008
-
Bonjour j'ai téléchargé le fichier zip mais cependant j'ai aussi un petit probleme j'ai l'erreur avec le fichier BDD et Fichier non défini est ce que j'aurai peu etre brulé une etape. pouvez vous s'il vous plait nous donner un peu plus de details sur ce pb.
merci d'avance.

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.