[.net] phototeque automatique v2.0

Description

Ce code gere une photeque une sorte de diaporama, elle est simple d'emploi, il suffit de mettre des dossiers dans le dossier photeque et de mettre des images dedans c tt :)
C'est une version 2 car j'avais deja mis un truc du genre mais beaucoup moins perfectionné

20/06/03
Ce que fait le prog :
- Liste tous les dossiers contenues dans photeques et les mais le nom en guise de menu, pour qu'un dossier soit caché il suffit de mettre off en minuscule devant le nom
- Verifie la presence d'un sous dossier miniature dans chaque dossier et peut le creer.
- Verifie la presence et le bon format de ttes les miniatures, et peut créer les miniatures
- Permet d'afficher une popup avec l'image à l'interieur, plus un copyright, quelque soit l'image a afficher, l'image aura tj le meme nom et se situera dans /image/photo_rendu.jpg
- Ecrit un fichier de log quand une miniature est crée il se trouve a la racine de l'application sous le nom de mylog.log, peut aussi faire un log des erreurs, j'ai pas bien exploité le log, mais vous pourrez simplement créee une nouvelle ligne il suffit de mettre ecrirelog("le texte",["erreur"]) [erreur] seulement pour le log d'erreur

Ce qu'il reste a faire:
- retravailler le fichier popup_photo.aspx, il est peu voir pas commenté, et n'integre pas beaucoup de fonctions
- Pouvoir choisir dans la popup entre plusieurs tailles originales et tailles moyenne
- faire les logs au format xml
- Mettre des commentaires à l'interieur des photos et pouvoir ainsi les commentés
- Faire une page de configuration qui permettrait tous les reglages comme le nombre de vignette par page et les enregistrer en XML
- Refaire un peu le designe général

Bug (mineur) mais connue
- Les arrondis pour le nombre de page ne se font pas par exces
- Quand on crée les miniatures il se peut que les images affichés ne soit encore pas crées

Source / Exemple :


'Il ya 4 fichiers en tout, deux pages html et leur codes correspondant, 

----------------phototeque.aspx----------------

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//FR">
<HTML>
	<HEAD>
		<title>WebForm1</title>
		<META http-equiv="Content-Type" content="text/html; charset=windows-1252">
		<meta name="vs_showGrid" content="True">
		<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
		<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
		<meta name="vs_defaultClientScript" content="JavaScript">
		<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
	</HEAD>
	<body>
		<form id="Form1" method="post" runat="server">
			<table width="100%" cellpadding="0" cellspacing="0">
				<asp:label id="lbl_erreur" runat="server" />
				<tr>
					<td height="102"><table width="100%">
							<tr>
								<td height="10"></td>
							</tr>
							<tr>
								<td height="20" align="middle"><B>[</B>
									<asp:repeater id="Repertoire" runat="server">
										<ItemTemplate>
											<asp:hyperlink id=hk text='<%# container.dataitem %>'
										NavigateUrl='<%# request.ServerVariables("URL") + "?categorie=" + container.dataitem %>' 
										runat="server" />
										</ItemTemplate>
										<SeparatorTemplate>
											|
										</SeparatorTemplate>
									</asp:repeater>
									<B>]</B>
								</td>
							</tr>
							<tr>
								<td height="10"></td>
							</tr>
							<tr>
								<td align="middle">
									<asp:repeater id="RepeaterPage" runat="server">
										<headertemplate>
											<B>[</B>
										</headertemplate>
										<itemtemplate>
											<asp:hyperlink id="Hyperlink1" 
										text='<%#container.dataitem%>' 
										NavigateUrl='<%# request.ServerVariables("URL") + "?categorie=" + request.QueryString("categorie") + "&page=" + container.dataitem %>' 
										runat="server" />
										</itemtemplate>
										<separatortemplate>
											|
										</separatortemplate>
										<footertemplate>
											<B>]</B>
										</footertemplate>
									</asp:repeater>
								</td>
							</tr>
							<tr>
								<td height="20"></td>
							</tr>
						</table>
						<asp:datalist CellSpacing="4" ID="list1" ItemStyle-HorizontalAlign="center" ItemStyle-VerticalAlign="middle" runat="server" ShowFooter="true" ShowHeader="true" Width="100%" height="377px" RepeatDirection="Horizontal" RepeatColumns="4">
							<itemtemplate>
								<asp:hyperlink id="photo" ImageUrl='<%#Container.dataitem%>' 
										NavigateUrl=<%# "javascript:window.open('popup_photo.aspx?photo=" & Container.dataitem & "','voiture','menubar=0;scrollbars=0,resizable=0,toolbar=0');window.close()" %>
										Width="140" Height="105" runat="server" 
										Target="_blank" />
							</itemtemplate>
						</asp:datalist>
						<table width="100%">
							<tr>
								<td height="20" align="right"><asp:label id="IndicateurPage" runat="server"/></td>
							</tr>
						</table>
					</td>
				</tr>
			</table>
		</form>
	</body>
</HTML>

=================================
=================================

----------------popup_photo.aspx----------------

<%@ Page Language="vb" Debug="true" CodeBehind="popup_photo.aspx.vb" AutoEventWireup="false" Inherits="phototeque.PopupPhoto" trace="false"%>
<HTML>
	<HEAD>
		<title>Document sans titre</title>
		<script language="JavaScript">
window.resizeTo(620,600);
		</script>
	</HEAD>
	<body bgcolor="#00004a" topmargin="0" leftmargin="0">
		<table width="100%">
			<tr>
				<td align="middle" height="50"><!--<img src="image/bandeau.JPG" width="300" height="50"/>--></td>
			</tr>
			<tr>
				<td align="middle" valign="middle"><asp:image runat="server" ID="photo" Height="450" /></td>
			</tr>
			<tr>
				<td align="middle" height="50"><!--<img src="image/bandeau.JPG" width="300" height="50"/>--></td>
			</tr>
		</table>
	</body>
</HTML>

==================================
==================================

----------------phototeque.aspx.vb----------------

Imports System.IO
Imports System.Drawing.Drawing2D
Imports System.Drawing
Imports System.Drawing.Imaging

Public Class phototeque
    Inherits System.Web.UI.Page

#Region " Code généré par le Concepteur Web Form "

    Protected WithEvents repeaterpage As System.Web.UI.WebControls.Repeater
    Protected WithEvents Repertoire As System.Web.UI.WebControls.Repeater
    Protected WithEvents list1 As System.Web.UI.WebControls.DataList
    Protected WithEvents IndicateurPage As System.Web.UI.WebControls.Label

    'Cet appel est requis par le Concepteur Web Form.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN : cet appel de méthode est requis par le Concepteur Web Form
        'Ne le modifiez pas en utilisant l'éditeur de code.
        InitializeComponent()
    End Sub

#End Region
#Region " Declaration de pas mal de variables"

    'declaration des variables pour les méthodes générique

    Private AccesLog As Boolean = False
    Private AccessErreurLog As Boolean = False

    'declaration des variables pour le controle des images

    Public ArrayListDossier As New ArrayList()
    Private ArrayListFichierParent As New ArrayList()
    Private ArrayListFichierMini As New ArrayList()

    Public Categorie As String

    Public PhotoMiniWidth As Integer = 140
    Public PhotoMiniHeight As Integer = 105

    'declaration des variables pour afficher le page

    Public NbColonne As Integer = 4
    Public NbLigne As Integer = 2
    Public NbImage As Integer = NbColonne * NbLigne
    Private PageAffiche As Integer ' page en cours
    Private NbFichierMini As Integer ' nb de miniature ds le dossier
    Private PageAfficheMax As Integer ' nb de page max

#End Region
#Region " Fonctions et méthodes géneriques"

    Public Sub EcrireLog(ByVal texte As String, Optional ByVal Fichier As String = "mylog")

        Dim LogStream As New StreamWriter(Fichier & ".log", True)
        If AccesLog = False And Fichier = "mylog" Then
            LogStream.WriteLine()
            LogStream.WriteLine("--- Debut d'une nouvelle entrée de log à " & Now() & " ---")
            AccesLog = True
        End If
        If AccessErreurLog = False And Fichier = "erreur" Then
            LogStream.WriteLine()
            LogStream.WriteLine("--- Debut d'une nouvelle entrée de log à " & Now() & " ---")
            AccessErreurLog = True
        End If

        LogStream.WriteLine(Now() & "    " & texte)
        LogStream.Close()

    End Sub

#End Region
#Region " Fonctions et méthodes pour controler les images"

    Private Sub PreparationDossier()

        If Not Directory.Exists(Server.MapPath("phototeque/")) Then
            EcrireLog("Il n'y avait aucun dossier phototèque on a tt abandonné", "erreur")
            Exit Sub
        End If

        Dim ArrayDossier As Array
        ArrayDossier = Directory.GetDirectories(Server.MapPath("phototeque/"))

        Dim Dossier As String
        For Each Dossier In ArrayDossier
            If Mid(Path.GetFileNameWithoutExtension(Dossier), 1, 3) <> "off" Then
                ArrayListDossier.Add(Path.GetFileName(Dossier))
            End If
        Next

        Repertoire.DataSource = ArrayListDossier
        Repertoire.DataBind()
        Repertoire.Dispose()

    End Sub ' Finit & pas commenté :/
    Private Sub VerificationDossier(ByVal Dossier As String)

        ' On verifie qu'il existe un sous dossier miniature, sinon on le crée
        If Not Directory.Exists(Server.MapPath("phototeque") & Path.DirectorySeparatorChar _
                                & Dossier & Path.DirectorySeparatorChar & _
                                "miniature") Then
            Directory.CreateDirectory(Server.MapPath("phototeque") & _
                                Path.DirectorySeparatorChar & Dossier & _
                                Path.DirectorySeparatorChar & "miniature")
            EcrireLog("Creation d'un dossier miniature dans" & Server.MapPath("phototeque") & Path.DirectorySeparatorChar & Dossier)
            Exit Sub
        End If

        ' Ici on verifie que toutes les images presntes
        ' dans le sous dossier miniature correspondant
        ' et on verifie aussi la taille des miniatures         

        ' On met toutes les photos (originale) dans un arraylist
        Dim ArrayFichierParent As Array
        ArrayFichierParent = Directory.GetFiles(Server.MapPath("phototeque") & _
                                Path.DirectorySeparatorChar & Dossier, "*.jpg")
        ArrayListFichierParent.AddRange(ArrayFichierParent)

        ' On met toutes les photos (miniature) dans un arraylist
        Dim ArrayFichierMini As Array
        ArrayFichierMini = Directory.GetFiles(Server.MapPath("phototeque") & _
                                Path.DirectorySeparatorChar & Dossier & _
                                Path.DirectorySeparatorChar & "miniature", "*.jpg")
        ArrayListFichierMini.AddRange(ArrayFichierMini)

        ' On range les deux arraylist dans l'ordre alphabetique pour que ce soit plus rapide
        ArrayListFichierMini.Sort()
        ArrayListFichierParent.Sort()

        ' Pour tous les fichiers contenues dans le dossier parent
        Dim FichierParent As String
        For Each FichierParent In ArrayListFichierParent

            ' On regarde s'il correspond dans le sous dossier miniature
            Dim FichierMini As String
            Dim i As Integer = 0 ' simple counter pour pouvoir supprimer ensuite le fichier dans l'array (gain de perf)
            Dim FichierModifie As Boolean = False ' pour savoir s'il est bon ou pas
            For Each FichierMini In ArrayListFichierMini
                ' C'est à cet undroit qu'on verifie que les deux fichiers 
                ' ont le meme nom et qu'il est a la bonne taille
                If Path.GetFileNameWithoutExtension(FichierMini) = Path.GetFileNameWithoutExtension(FichierParent) _
                                And VerificationTaille(FichierMini) = True Then
                    FichierModifie = True
                    ' Une fois que le fichier est trouvé on peut l'enlever de la liste
                    ' et a la fin de tous les test l'araylist permet de voir ttes les jpeg inutiles
                    ArrayListFichierMini.RemoveAt(i)
                    Exit For
                End If

                i += 1
            Next

            ' Si le fichier est pas bon on l'emmene se faire refaire ;)
            If FichierModifie = False Then
                CorrectionTaille(FichierParent)
            End If

        Next
    End Sub ' Finit & commenté :)
    Public Function VerificationTaille(ByVal Photo As String) As Boolean

        ' On crée un bitmap avec la photo
        Dim BmpPhoto As New Bitmap(Photo)

        ' On verifie la taille du bitmap
        If BmpPhoto.Width >= PhotoMiniWidth And BmpPhoto.Height = PhotoMiniHeight Then
            VerificationTaille = True
        Else
            VerificationTaille = False
        End If
        ' On libere la photo
        BmpPhoto.Dispose()

    End Function ' Finit & commenté :)
    Private Sub CorrectionTaille(ByVal Photo As String)

        Dim PhotominiPath As String
        PhotominiPath = Server.MapPath("phototeque") & Path.DirectorySeparatorChar & _
                                Categorie & Path.DirectorySeparatorChar & _
                                "miniature" & Path.DirectorySeparatorChar & _
                                Path.GetFileNameWithoutExtension(Photo) & ".jpg"

        Dim BmpPhoto As New Bitmap(Photo)
        Dim BmpPhotoMini As New Bitmap(PhotoMiniWidth, PhotoMiniHeight)
        Dim graphicsPhotoMini As Graphics = Graphics.FromImage(BmpPhotoMini)
        graphicsPhotoMini.DrawImage(BmpPhoto, _
                                New Rectangle(0, 0, PhotoMiniWidth, PhotoMiniHeight), _
                                0, 0, BmpPhoto.Width, BmpPhoto.Height, _
                                System.Drawing.GraphicsUnit.Pixel)
        BmpPhoto.Dispose()
        graphicsPhotoMini.Dispose()

        If File.Exists(PhotominiPath) Then
            File.Delete(PhotominiPath)
        End If

        BmpPhotoMini.Save(PhotominiPath, System.Drawing.Imaging.ImageFormat.Jpeg)
        BmpPhotoMini.Dispose()

        EcrireLog("Creation de la miniature de " & Path.GetFileNameWithoutExtension(Photo) & " réalisé avec succé")
    End Sub ' Finit & pas commenté :#End Region
#Region " Fonctions et méthodes pour afficher la page"

    Private Sub AfficherMiniature(ByVal NumeroPage As Integer)

        ' On crée une variable du dossier parents au cas ou 
        ' il y est des photos inutiles dans le sous dossier
        Dim PhotominiPath As String
        PhotominiPath = Server.MapPath("phototeque") & Path.DirectorySeparatorChar & _
                                Categorie & Path.DirectorySeparatorChar

        ' On nettoie cette ArrayList car je vais m'en resservir
        ArrayListFichierMini.Clear()

        ' On  met ttes les images dans un array
        Dim ArrayFichierNormal As Array
        ArrayFichierNormal = Directory.GetFiles(PhotominiPath, "*.jpg")

        Dim count As Integer = 0 ' un petit counter
        Dim NumeroImage As Integer = 0 ' pour connaitre a quelle image on en est
        Dim FichierNormal As String
        For Each FichierNormal In ArrayFichierNormal
            ' On commence a remplir ArrayListFichierMini seulement à partir du N° de l'image
            If NumeroImage >= (NumeroPage - 1) * NbImage Then
                ' On fais un replace car Path.DirectorySeparatorChar est un \                ' ensuite je passe cette variable par querystring + javascript
                ' et ca m'enleve ca \\ donc je remplace par /
                ArrayListFichierMini.Add(Replace(PhotominiPath & "miniature" & _
                                    Path.DirectorySeparatorChar & _
                                    Path.GetFileNameWithoutExtension(FichierNormal) & _
                                    ".jpg", "\\", "/"))
                count += 1
                ' Si il y a suffisemment d'image on arrete
                If count >= NbImage Then
                    Exit For
                End If
            End If
            NumeroImage += 1
        Next

        ' On configure la liste
        list1.RepeatDirection = RepeatDirection.Horizontal
        list1.RepeatColumns = NbColonne
        list1.DataSource = ArrayListFichierMini
        list1.DataBind()
        list1.Dispose()

    End Sub ' Finit & commenté :)
    Private Sub AficherNbPAge()

        ' On crée une variable du dossier parents au cas ou 
        ' il y est des photos inutiles dans le sous dossier
        Dim PhotominiPath As String
        PhotominiPath = Server.MapPath("phototeque") & Path.DirectorySeparatorChar & _
                                Categorie & Path.DirectorySeparatorChar

        ' On nettoie cette ArrayList car je vais m'en resservir
        ArrayListFichierMini.Clear()

        ' On  met ttes les images dans un array
        Dim ArrayFichierNormal As Array
        ArrayFichierNormal = Directory.GetFiles(PhotominiPath, "*.jpg")

        ' On integere l'Array dans l'ArrayList
        ArrayListFichierMini.AddRange(ArrayFichierNormal)

        ' On va compter le nombre d'image
        NbFichierMini = ArrayListFichierMini.Count

        ' On va definir le nombre de page necessaire
        Dim NbPage As Integer
        NbPage = (NbFichierMini / NbImage) 'Math.Ceiling

        'On crée un arraylist avec ttes les pages necessaires
        Dim ArrayListNbPage As New ArrayList()
        Dim i As Integer
        For i = 1 To NbPage
            ArrayListNbPage.Add(i.ToString)
        Next

        ' On configure le repeater
        repeaterpage.DataSource = ArrayListNbPage
        repeaterpage.DataBind()
        repeaterpage.Dispose()

    End Sub
#End Region
#Region " Evenements liés aux fonctionnement de la page"

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'Definit le repertoire dans lequel se trouve la page
        Directory.SetCurrentDirectory(Server.MapPath(""))

        ' Definit dans quelle categorie nous nous trouvons
        Categorie = Request.QueryString("categorie")

        ' Permet d'affichier la liste des dossiers que l'on pourra voir dans la phototeque
        PreparationDossier()

        ' Si aucune categorie est choisis on peut indiquer une erreur 
        ' et on redirige vers la premiere categorie de l'arraylist
        If Categorie = "" Then
            Categorie = ArrayListDossier.Item(0)
        End If

        ' Trie l'arraylist pour pouvoir faire une recherche
        ' et on recherche si il existe pas,
        ' on redirige vers la premiere categorie de l'arraylist
        ArrayListDossier.Sort()
        If ArrayListDossier.BinarySearch(Categorie) < 0 Then
            Categorie = ArrayListDossier.Item(0)
        End If

        ' Verifie si le dossier miniature existe sinon le crée
        VerificationDossier(Categorie)

        ' Permet d'afficher la liste des pages
        AficherNbPAge()

        ' Verifie que le numero de page indiqué soit correcte,
        ' S'il n'y en a pas on prend la premiere
        ' et on affiche les miniatures
        PageAffiche = Request.QueryString("page")
        Try
            PageAffiche = CInt(PageAffiche)
        Catch
            PageAffiche = 1
        Finally
            '/!\\ Aucun arrondit a revoir pour arrondit par exces
            PageAfficheMax = NbFichierMini / NbImage
            If PageAffiche <= 0 Or PageAffiche > PageAfficheMax Then
                PageAffiche = 1
            End If
            AfficherMiniature(PageAffiche)
        End Try

        ' Remplit IndicateurPage pour savoir où on en est
        IndicateurPage.Text = "page N° " & PageAffiche & " sur " & PageAfficheMax

    End Sub

#End Region

End Class

===================================
===================================

----------------popup_photo.aspx.vb----------------

Imports System.Drawing.Drawing2D
Imports System.IO
Imports System.Drawing

Public Class PopupPhoto
    Inherits System.Web.UI.Page
    Protected WithEvents photo As System.Web.UI.WebControls.Image

#Region " Code généré par le Concepteur Web Form "

    'Cet appel est requis par le Concepteur Web Form.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN : cet appel de méthode est requis par le Concepteur Web Form
        'Ne le modifiez pas en utilisant l'éditeur de code.
        InitializeComponent()
    End Sub

#End Region
    Public nom_photo As String

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Trace.Warn(Request.QueryString("photo"))
        DessineStats()
        photo.ImageUrl = "image\\photo_rendu.jpg"
    End Sub

    Sub DessineStats()

        Dim myDirectoryInfo As DirectoryInfo = Directory.GetParent(Request.QueryString("photo"))

        Dim newImage As System.Drawing.Image = _
                    System.Drawing.Image.FromFile( _
                    myDirectoryInfo.Parent.FullName & _
                    Path.DirectorySeparatorChar & _
                    Path.GetFileName(Request.QueryString("photo")))

        Dim hauteur, largeur As Integer
        hauteur = 450
        largeur = 600

        Dim mB As New Bitmap(newImage, largeur, hauteur)
        Dim g As Graphics = Graphics.FromImage(mB)
        g.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality
        Dim drawFont As New Font("comic sans ms", 16, FontStyle.Bold)
        Dim srectangle As New Rectangle(0, 0, 100, 32)
        Dim drawBrush As New Drawing2D.LinearGradientBrush(srectangle, Color.Gray, Color.White, LinearGradientMode.Vertical)
        g.DrawString("www.monsite.fr.st", drawFont, drawBrush, largeur / 2, hauteur - 32)
        mB.Save("image" & Path.DirectorySeparatorChar & "photo_rendu.jpg", Imaging.ImageFormat.Jpeg)
        mB.Dispose()
        g.Dispose()
        newImage.Dispose()
    End Sub
End Class

============================
============================
============================

Conclusion :


Si vous trouvez des bugs dites le moi, si vous avez des idées, ou si vous avez modifié le code dites le moi aussi.
Pour l'installer, il suffit de dezipper et de créer une aplication pour le dossier, il vous faut aussi les droit d'ecriture (il me semble), sinon G essayé de laisser le code assez comprehensible, j'ai essayé de bien le commenté.
G changé de version de framework en cours de developement v1.0.3705 ==> v1.1.4322 mais je pense que l'application reste compatible avec la framework 1.1 :)

apparemment le zip fonctionne pas, pour le faire fonctionner, il ne faut pas ouvrir le .sln mais le .vbproj puis ecraser le sln apres, normalement ca marche, si qqn sait comment faire pour ziper un projet web je suis preneur ;)

----------------------------------------------------------------
Comme il y avait quelques problèmes pour l'installation je vous ai mis un fichier MSI qui vous fait tous, vous pouvez le trouver ici : http://jesusonline.int.webmatrixhosting.net/Download/Setup2.msi (400ko) il suffit juste de le lancer et le projet s'installe sur votre serveur et configure IIS :)

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.