Pièce jointe formulaire asp.net

Résolu
cirtey Messages postés 30 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 8 mai 2009 - 2 janv. 2008 à 18:04
cirtey Messages postés 30 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 8 mai 2009 - 3 janv. 2008 à 09:25
Bonjour;

Je cherche à ajouter une fonctionnalité attacher pièce jointe à mon formulaire asp.net sans succès.

J'ai le message d'erreur suivant:
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

Line 55:
Line 56: String StrFileName = "";
Line 57: StrFileName = Request.Files["fileAttachment"].FileName;
Line 58: if (StrFileName != "")
Line 59: {

Source File: c:\Documents and Settings\TBSoltane\Mes documents\Visual Studio 2008\WebSites\Prestige\Fra\frContact.aspx.cs Line: 57

Le code frContact.aspx:


[frContact.aspx Contact]
[frDefault.aspx Accueil]
[frProducts.aspx Produits]
[frPartners.aspx Partenaires]
[frReferences.aspx Réferences]
[frAbout.aspx A propos]
[frTestimonials.aspx Témoignages]






Contactez-nous



Siège social



Prestige concepts

LL1/9-Kortoba Riadh El Andalous

2058 Ariana Tunis Tunisie



tel: (+216)71 82 07 47 / (+216)71 82 07 46



fax: (+216)71 82 07 48


[mailto:info@prestigeconcepts.com info@prestigeconcepts.com]









----

Entreprise,
,
*,

----

Nom,
,
*,

----

Email,
,
*
*,

----

Tél.,
,
*,

----

Message*,
,
*
*,

----

Attachment,
,




 





Tous les champs sont obligatoires


* = Maximum 1000 caractères, minimum 20.












 






Prestige Concepts à votre écoute.





Si vous avez une quetion, n'hésitez pas à nous contacter. Une équipe réactive et dynamique vous répondra rapidement. 







Le code de frContact.aspx.cs:
using System;
using System.Web.Mail;
using System.IO;

public partial class frContact : System.Web.UI.Page
{
protected System.Web.UI.HtmlControls.HtmlInputFile file;
protected void CustomValidator1_ServerValidate(object source, System.Web.UI.WebControls.ServerValidateEventArgs args)
{
if ((txtMessage.Text.Length < 20) || (txtMessage.Text.Length > 1000))
{
args.IsValid = false;
}
else
{
args.IsValid = true;
}
}

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
txtName.Text = "";
txtEmail.Text = "";
txtCompany.Text = "";
txtPhone.Text = "";
txtMessage.Text = "";
}
}

protected void btnValidate_Click(object sender, EventArgs e)
{

MailMessage email = new MailMessage();

email.From = "site@prestigeconcepts.fr";
email.To = "info@prestigeconcepts.fr";

email.Body =
"Name :"
+ txtName
+ "\r\n"
+ "Email :"
+ txtEmail
+ "\r\n"
+ "Company: "
+ txtCompany.Text
+ "\r\n"
+ "Phone : "
+ txtPhone.Text
+ "\r\n"
+ "Message : "
+ txtMessage.Text;

String StrFileName = "";
StrFileName = Request.Files["fileAttachment"].FileName;
if (StrFileName != "")
{

//extraction fichier avec chemin
StrFileName = StrFileName.Substring(StrFileName.LastIndexOf("\") + 1);
//enregistrement en temp
Request.Files["fileAttachment"].SaveAs(Server.MapPath(StrFileName));
//attacher le fichier
MailAttachment MyAttachment = new MailAttachment(Server.MapPath(StrFileName));
email.Attachments.Add(MyAttachment);
}

email.Priority = MailPriority.High;

SmtpMail.SmtpServer = "smtp.planet.tn";

try
{
SmtpMail.Send(email);
}
catch (Exception ex)
{
lblError.Text = ex.Message;
}
finally
{
lblError.Text = "Message envoyé avec succès";

}
if (StrFileName != "")
File.Delete(Server.MapPath(StrFileName));

}

}

Je pense que je doit créer un objet et l'instancier pour résoudre le
problème. Mais, j'ai beau chercher, je ne sais pas comment faire.


Merci de votre aide.

2 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
2 janv. 2008 à 22:54
Salut,


Quelques remarques au passage :


email.Body =
"Name :"
+ txtName
+ "\r\n"
+ "Email :"
+ txtEmail
+ "\r\n"
+ "Company: "
+ txtCompany.Text
+ "\r\n"
+ "Phone : "
+ txtPhone.Text
+ "\r\n"
+ "Message : "
+ txtMessage.Text;


a remplacer par quelquechose du genre :


email.Body = String.Format("Name :{0}\r\nEmail :{1}\r\nCompany: {2}\r\nPhone : {3}\r\nMessage : {4}",
txtName,
txtEmail,
txtCompany.Text,
txtPhone.Text,
txtMessage.Text
);


 


 




String StrFileName = "";
StrFileName = Request.Files["fileAttachment"].FileName;
if (StrFileName != "")
{
    //extraction fichier avec chemin
    StrFileName = StrFileName.Substring(StrFileName.LastIndexOf("\") + 1);
    //enregistrement en temp
    Request.Files["fileAttachment"].SaveAs(Server.MapPath(StrFileName));
    //attacher le fichier
    MailAttachment MyAttachment = new MailAttachment(Server.MapPath(StrFileName));
    email.Attachments.Add(MyAttachment);
}


a remplacer par quelquechose de ce genre


String StrFileName = "";
HttpPostedFile attachment = Request.Files["fileAttachment"];
if ( attachment != null )
{
    //extraction fichier avec chemin
    StrFileName = Path.GetFileName(attachment.FileName);
   
    //enregistrement en temp
    attachment.SaveAs(Server.MapPath(StrFileName));
   
    //attacher le fichier
    MailAttachment MyAttachment = new MailAttachment(Server.MapPath(StrFileName));
    email.Attachments.Add(MyAttachment);
}






Hormis ceci, essaie de penser à ce qui va se passer si 2 utilisateurs attachent chacun un fichier portant le même nom...
De plus je vois que tu es en .NET 3.5, hors les classes utilisant MailAttachment sont obsolètes depuis .NET 2.0, comme indiqué en rouge gras dans la doc : http://msdn2.microsoft.com/fr-fr/library/system.web.mail.mailattachment(VS.80).aspx

Surtout que dans les nouvelles classes, les pièces jointes peuvent provenir d'un flux, ce qui tombe bien vu que la classe HttpPostedFile en fourni justement un, résolvant au passage ton problème d'écriture sur disque.

/*
coq
MVP Visual C#
CoqBlog
*/
3
cirtey Messages postés 30 Date d'inscription lundi 29 janvier 2007 Statut Membre Dernière intervention 8 mai 2009
3 janv. 2008 à 09:25
Merci pour ton retour.
J'ai finalement opté hier pour un asp:fileupload à la place de la méthode se basant sur du html et cela marche.
0
Rejoignez-nous