vendredi 3 octobre 2008

SQL Server 2005: enregistrer et afficher des images

Dans cet article, je présente un exemple assez simple de l'enregistrement d'une image en utilisant le type de données Image fourni dans SQL Server 2005.

Voici la table que j'utilise:

image

Procédures stockées :

Nom et description Code

spInsertImage : enregistrer une image

create PROCEDURE [dbo].[spInsertImage]
(
@nom varchar(50),
@photo image
)
AS

INSERT INTO images(nom, photo)
VALUES
(@nom, @photo )

select @@IDENTITY

spGetImageByID : récuperer une image avec son ID

create procedure [dbo].[spGetImageByID]
( @id int )
as

select  *
from images
where ID = @id

Interface utilisateur: Enregistrement.

Le contrôle FileUpload permet à l'utilisateur de sélectionner à partir du disque l'image à enregistrer.

<asp:Label ID="lblMessage" runat="server" ForeColor="Red" Width="260px"></asp:Label>
<
br />
<
br />
<
fieldset>
<
legend>Enregistrement Image</legend>
<
br />
Nom :
<asp:TextBox ID="txtNom" runat="server" Width="380px"></asp:TextBox><br />
<
br />
<
asp:FileUpload ID="FileUpload1" runat="server" Width="500px" /><br />
<
br />
<
asp:Button ID="cmdSave" runat="server" Text="Enregistrer image" OnClick="cmdSave_Click"
Height="30px" Width="230px" /><br />
<
br />
</
fieldset>



C#:



protected void cmdSave_Click(object sender, EventArgs e)
{
try
{
if (FileUpload1.PostedFile != null)
{
if (FileUpload1.PostedFile.ContentLength > 0)
{
HttpPostedFile objHttpPostedFile = FileUpload1.PostedFile;

// Vérifier l'extention du fichier. Dans cet exemple, seules les images jpg sont authorisées
string FileExtention = System.IO.Path.GetExtension(FileUpload1.PostedFile.FileName);

if (FileExtention == ".jpg")
{
int intContentlength = objHttpPostedFile.ContentLength;

Byte[] bytImage = new Byte[intContentlength];

objHttpPostedFile.InputStream.Read(bytImage, 0, intContentlength);

//Insertion de l'image ds base de données
DAImage daimage = new DAImage();
InsertedImageID = daimage.InsertImage(txtNom.Text, bytImage);
lblMessage.Text = "Enregistrement effectué.";

ddlNom.Items.Clear();
ddlNom.Items.Add(new ListItem("Sélectionnez une image", "0"));
ddlNom.DataBind();

}
else
{
lblMessage.Text = "Fichiers jpg uniquement.";
}
}
}
}
catch (Exception Exp)
{
lblMessage.Text = "Echec lors de l'enregistrement : <br />" + Exp.ToString();
}
}



Il est necessaire de contrôler l'extention du fichier selectionné par l'utilisateur afin d'eviter l'upload de fichiers exe qui pourraient representer un danger.



L'image est passée à la partie DAL qui s'occupe d'appeler spInsertImage afin d'enregistrer l'image dans la base.



Affichage de l'image:


L'affichage de l'image se fait de la même manière, en appelant spGetImageByID.


Afin d'afficher l'image dans un contrôle Image, il suffit de mettre ce code dans une page ViewImage.aspx et attribuer l'image au contrôle comme suit:




Page où l'on souhaite afficher l'image:



<fieldset>
<
legend>Affichage</legend>Nom image :
<asp:DropDownList ID="ddlNom" runat="server" DataSourceID="SqlDataSourceListeImages"
DataTextField="nom" DataValueField="ID" AppendDataBoundItems="True" Width="230px">
<
asp:ListItem Value="0">S&#233;lectionnez une image</asp:ListItem>
</
asp:DropDownList>
<
asp:Button ID="cmdDisplay" runat="server" Text="Afficher" Height="34px" OnClick="cmdDisplay_Click"
Width="260px" />
<
asp:SqlDataSource ID="SqlDataSourceListeImages" runat="server" ConnectionString="<%$ ConnectionStrings:TestImagesConnectionString %>"
SelectCommand="SELECT [ID], [nom] FROM [Images]"></asp:SqlDataSource>
<
br />
<
br />
<
asp:Image ID="ViewImage" runat="server" />
</
fieldset>


C#:



protected void cmdDisplay_Click(object sender, EventArgs e)
{
string strURL = "~/ViewImage.aspx?idimage=" + ddlNom.SelectedItem.Value ;
ViewImage.ImageUrl = strURL;
}

mercredi 13 août 2008

ASP.NET 2.0: Upload de fichiers

L'upload de fichiers en asp.net 2.0 peut se faire facilement grâce au contrôle FileUpload.

Dans l'exemple suivant, j'effectue un upload d'images vers un emplacement spécifique, qui est le chemin d'une 2ème application.

Création du dossier:

Je commence par créer un dossier dans l'emplacement voulu. ce dossier contiendra mes images.

    <asp:LabelID="lblMessage"runat="server"ForeColor="Red"></asp:Label>
    <
br />
    <
table>
        <
tr> <td>
                <
asp:LabelID="Label3"runat="server"Text="Chemin de l'application :">
                </
asp:Label>
            </
td>
            <
td>
                <
asp:TextBox ID="txtApplicationPath"runat="server"Width="223px"
                  
ValidationGroup="Val1"></asp:TextBox>
                <
asp:RequiredFieldValidator ID="RequiredFieldValidator1"runat="server"
                  
ControlToValidate="txtApplicationPath"
                  
ErrorMessage="Entrez le chemin de l'application"ValidationGroup="Val1">
                </
asp:RequiredFieldValidator>
            </
td>
        </
tr>
        <
tr>
            <
td>
                <
asp:LabelID="Label1"runat="server"Text="Nom du Dossier :"></asp:Label>
            </
td>
            <
td>
                <
asp:TextBox ID="txtFolderName"runat="server"Width="221px"
                  
ValidationGroup="Val1"></asp:TextBox>
                <
asp:RequiredFieldValidator ID="RequiredFieldValidator2"runat="server"
                  
ControlToValidate="txtFolderName"ErrorMessage="Entrez le nom du dossier"ValidationGroup="Val1">
                </
asp:RequiredFieldValidator>
            </
td>
        </
tr>
        <
tr>
            <
td>
              
&nbsp;</td>
            <
td>
                <
asp:ButtonID="cmdCreateFolder"runat="server"onclick="cmdCreateFolder_Click"
                  
Text="Créer le dossier"Width="279px"ValidationGroup="Val1" />
            </
td>
        </
tr>

C#

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//indication du chemin de la 2eme application
txtApplicationPath.Text = "C:\\DEV\\MyBook\\img";
}

}

protected void cmdCreateFolder_Click(object sender, EventArgs e)
{
string path = @txtApplicationPath.Text + "\\" + txtFolderName.Text;

try
{
if (Directory.Exists(path))
{
lblMessage.Text = "Le dosser" + path + " existe déjà. Veuillez choisir un nom different.";
return;
}

// création du dossier
DirectoryInfo di = Directory.CreateDirectory(path);
lblMessage.Text = "Le dossier " + txtFolderName.Text + " a été créé avec succès";
}
catch (Exception ex)
{
lblMessage.Text = "Echec lors de la création du dossier : " + ex.ToString();
}

}


Le dossier saisi dans "Nom du dossier" sera créé dans l'emplacement "Chemin de l'application".

En Form_Load, je précise le chemin de l'application. La meilleure manière de spécifier ce chemin est de l'enregistrer dans une base de données afin de pouvoir eventuellement le mettre à jour si necessaire, sans avoir à revenir au code.



Upload d'images:


Voici une implémentation de l'utilisation du contrôle FileUpload:

<table>
<
tr>
<
td style="width: 146px">
<
asp:Label ID="Label2" runat="server" Text="Images :"></asp:Label>
</
td>
<
td>
<
asp:FileUpload ID="FileUpload1" runat="server" Width="217px" />&nbsp;<asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server"
ControlToValidate="FileUpload1" Display="Dynamic"
ErrorMessage="Selectionnez une image" ValidationGroup="Val2"></asp:RequiredFieldValidator>&nbsp;
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server"
ControlToValidate="FileUpload1" Display="Dynamic"
ErrorMessage="Fichiers jpg, gif ou png uniquement"
ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))+(.jpg|.gif|.png)$"></asp:RegularExpressionValidator>
</td>
</
tr>
<
tr>
<
td style="width: 146px">
&nbsp;</td>
<
td>
<
asp:Button ID="cmdAddPhoto" runat="server" OnClick="cmdAddPhoto_Click" Text="Ajouter"
Width="282px" ValidationGroup="Val2" />
</
td>
</
tr>
</
table>



Le contrôle RegularExpressionValidator est utilisé afin de contrôler le type du fichier selectionné par l'utilisateur. Ici je limite l'upload aux fichiers jpg, gif et png.



C#

protected void cmdAddPhoto_Click(object sender, EventArgs e)
{
try
{
FileUpload1.SaveAs(@txtApplicationPath.Text + "\\" + txtFolderName.Text + "\\" + "changedname.jpg");
lblMessage.Text = "Photo ajoutée";

}
catch (Exception ex)
{
lblMessage.Text = "Echec lors de l'ajout de la photo : " + ex.ToString();
}
}

vendredi 1 août 2008

Passage de QueryString à un contrôle Silverlight

Supposant que j'ai une page Recherche.aspx qui contient un lien "Afficher" qui redirige vers Livre.aspx, laquelle contient un contrôle Silverlight:

query

Le QueryString peut être recupéré dans Page.xaml.cs (si vous utilisez C#) de la manière suivante:

string IDLivre = HtmlPage.Document.QueryString["IDLivre"];

jeudi 31 juillet 2008

Silverlight: passage de paramètres

Une méthode très simple pour passer un paramètre d'une page à une autre est d'utiliser App.Current.Resources comme suit:

App.Current.Resources.Add("BookID", "1");

Celà enregistre la valeur 1 dans BookID.

Pour réutiliser le paramètre:

App.Current.Resources["BookID"].ToString();

lundi 28 juillet 2008

Silverlight 2 Beta 2: sys.InvalidOperationException: InitializeError #2104

J'ai eu la chance (travaillé comme une malade lol) ces derniers temps sur Silverlight. Le site www.silverlight.net m'a été d'une grande aide. J'ai pratiquement appris tout ce que je connais aujourd'hui sur le sujet grâce à ce site. Une erreur fréquente lors du déploiement: le contrôle Silverlight ne se charge pas, page aspx vide, bien que le plugin soit bien installé, avec l'erreur suivante: sys.InvalidOperationException: InitializeError #2104
Cette erreur est due au fait que le fichier ".xap" n'est pas enregistré autant que type MIME au niveau de IIS.

Voici comment l'enregistrer:
Sur IIS:


image

Cliquez sur "Propriétés", puis Type MIME, puis Nouveau:

image

Entrez les valeurs suivantes puis validez: 
  - Extension: .xap
  - Type MIME: application/x-silverlight-2-b2
et voilà ! :-)

mercredi 28 mai 2008

Validation de checkbox: cocher au moins une case

Dans mon formulaire, j'ai 2 Checkbox, l'utilisateur doit cocher au moins une sinon les 2.

J'ai placé les 2 cases à cocher et le validateur dans un UserControl. La validation se fait à l'aide d'une fonction javascript.

Voici le UserControl:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CheckBoxControlMatSoir.ascx.cs" Inherits="Controls_DataEntryControls_CheckBoxControlMatSoir" %>

<script language="javascript" type="text/javascript">
function
ValidateTandCs(source, args)
{
var chkMat = document.getElementById('<%= CheckBoxMat.ClientID %>');
var chkAprem = document.getElementById('<%= CheckBoxAprem.ClientID %>');

if ((chkMat.checked) || (chkAprem.checked))
{
args.IsValid = true;
}

if ((chkMat.checked==false) && (chkAprem.checked==false))
{
args.IsValid = false;
}
}
</script>

<
br />
<
asp:CheckBox ID="CheckBoxMat" runat="server" Text="Matinée" ForeColor="Navy" />
&nbsp;&nbsp; &nbsp;
<asp:CustomValidator ID="valTandCs" ClientValidationFunction="ValidateTandCs" runat="server"
ErrorMessage="*" Height="1px"></asp:CustomValidator><br />
<
asp:CheckBox ID="CheckBoxAprem" runat="server" Text="Après-midi" ForeColor="Navy" />





Le code behind:

C#

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;


public partial class Controls_DataEntryControls_CheckBoxControlMatSoir : System.Web.UI.UserControl
{
private bool m_mat_checked = false;
private bool m_aprem_checked = false;


protected void Page_Load(object sender, EventArgs e)
{
m_mat_checked = CheckBoxMat.Checked;
m_aprem_checked = CheckBoxAprem.Checked;
}


public object MatChecked
{
get { return m_mat_checked; }
set
{
if (value.GetType() == DBNull.Value.GetType()) m_mat_checked = false;
else if (value == null) m_mat_checked = false;
else if (value.GetType() == typeof(bool)) m_mat_checked = (bool)value;
else m_mat_checked = false;
}
}

public object ApremChecked
{
get { return m_aprem_checked; }
set
{
if (value.GetType() == DBNull.Value.GetType()) m_aprem_checked = false;
else if (value == null) m_aprem_checked = false;
else if (value.GetType() == typeof(bool)) m_aprem_checked = (bool)value;
else m_aprem_checked = false;
}
}

protected void Page_PreRender()
{
CheckBoxMat.Checked = m_mat_checked;
CheckBoxAprem.Checked = m_aprem_checked;
}

}





Dans la page aspx, il suffit d'insérer le UserControl. Je fais également un Binding grâce aux propriétés MatChecked et ApremChecked du UserControl.

<uc1:CheckBoxControlMatSoir ID="CheckBoxControlMatSoir1" runat="server" 
MatChecked='<%# Bind("matin") %>' ApremChecked='<%# Bind("soir") %>' />

vendredi 23 mai 2008

HTML: Espacement entre les lignes

Utiliser l'élément line-height de la propriété style :

<p style="line-height: 2; text-align: justify">
Le Papa de Toto rentre un jour avec un robot détecteur de mensonge dont la particularité est de gifler le menteur. Ce soir, Toto rentre tard de l'école et son Papa lui demande : Pourquoi rentres-tu tard ? On a dû faire des heures supplémentaires. Subitement, le robot se lève et lui donne une gifle. Non, j'étais allé voir un film. Quel film ? Les dix commandements. Slap, une autre gifle. Excuse-moi Papa, « Les reines du sexe ». Tu n'as pas honte ? A ton âge, je n'avais jamais vu ces genres de films. Slap, Papa reçoit une gifle. Maman qui suivait la scène de la cuisine sort et dit. « Mais André, de quoi te plains-tu ? Il te ressemble bien Toto. Après tout c'est ton fils ! » Et Slap, elle reçoit une gifle.</p>

Le résultat est le suivant:

Le Papa de Toto rentre un jour avec un robot détecteur de mensonge dont la particularité est de gifler le menteur. Ce soir, Toto rentre tard de l'école et son Papa lui demande : Pourquoi rentres-tu tard ? On a dû faire des heures supplémentaires. Subitement, le robot se lève et lui donne une gifle. Non, j'étais allé voir un film. Quel film ? Les dix commandements. Slap, une autre gifle. Excuse-moi Papa, « Les reines du sexe ». Tu n'as pas honte ? A ton âge, je n'avais jamais vu ces genres de films. Slap, Papa reçoit une gifle. Maman qui suivait la scène de la cuisine sort et dit. « Mais André, de quoi te plains-tu ? Il te ressemble bien Toto. Après tout c'est ton fils !» Et Slap, elle reçoit une gifle.