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 :)
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.