Download et UpdatePanel

Résolu
Praxe Messages postés 9 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 13 février 2007 - 5 janv. 2007 à 16:59
scilaci Messages postés 5 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 13 janvier 2009 - 13 janv. 2009 à 13:14
Bonjour !
Mon souci est le suivant : j'ai un bouton qui me permet de télécharger un fichier qui est sur le serveur. J'utilise ce code (lors du clic sur le bouton) :
Response.Clear();
Response.AppendHeader("content-disposition","attachment;filename="" + System.IO.Path.GetFileName(sPath) + """);
Response.ContentType = "application/pdf";
Response.WriteFile(sPath);
Response.End();

Pas de problème lorsque ce bouton est à l'extérieur d'un updatepanel. Lorsqu'il est placé dans un updatepanel, la fenêtre qui propose le téléchargement ne s'affiche pas. En mettant dans un try/catch le code plus haut, ca plante au niveau du Response.End();

Il doit y avoir un concept d'atlas/ajax qui m'échappe (surement même :D). Est ce que quelqu'un pourrait m'éclairer ?
Merci d'avance

9 réponses

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
8 janv. 2007 à 13:25
Bonjour,

As tu compris la solution proposé ? car cette solution est vraiment stupide ... la seule solution que tu as est de passer par une page externe ...

un .ashx est un handler pur et dur, une page est aussi un handler mais elle charge beaucoup de chose (tout le mécanisme de controle) alors qu'un .ashx ne charge rien de tout ca tu as accès seulement à l'objet response. Dans le processRequest tu peux accéder à context.Request.QueryString["FileID"] ensuite à partir de cette id tu peux écrire dans context.Response.WriteFile ... pour des raisons de sécurité ne passe surtout pas le path du fichier en paramètre ...

<hr />Cyril - MVS - MCP
3
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
5 janv. 2007 à 22:34
Bonsoir,

c'est tout à fait normal, quand tu fais un response.clear() etc... tu modifies le flux complet de ta response ... Or le comportement d'un updatepanel nécessite que l'on renvoie un flux spécifique qui contient une partie de la page, donc tu ne peux pas jouer avec la réponse, si tu veux faire un truc du genre il faut faire un scriptmanager.registerstartupscript(this.gettype(), "download","window.open('lapage.ashx?fileID', '', ''')", true);

ensuite il te faut faire un handler (lapage.ashx) pour récupérer le fichier à partir de son id

<hr />Cyril - MVS - MCP
0
Praxe Messages postés 9 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 13 février 2007
8 janv. 2007 à 12:12
Merci de ta réponse cyril. A vrai dire je ne sais pas du tout utiliser l'extension "ashx". Donc il va falloir que je regarde ça d'abord, même si je vois pas trop comment réaliser ça pour l'instant. Sinon j'ai trouvé une autre solution entre temps (http://www.velocityreviews.com/forums/t364910-view-pdf-in-atlas.html)
Dans le Page_Load :

LinkButton ctrl = (
LinkButton)Page.FindControl(
"ALinkButton");ALinkButton.Click +=

new
EventHandler(Button1_Click);Button1.Attributes.Add(

"onclick", Page.ClientScript.GetPostBackEventReference(ALinkButton,
""));

protected
void Button1_Click(
object sender,
EventArgs e){

Response.Clear();

Response.AppendHeader(

"content-disposition",
"attachment;filename="" + System.IO.
Path.GetFileName(sPath) +
""");Response.ContentType =

"application/pdf";Response.WriteFile(sPath);

Response.Flush();

Response.End();

}

où button1 se situe dans l'update panel et ALinkButton à l'extérieur.

Bon ca marche plutot bien, sauf que (  ) mon bouton se situe dans une cellule d'un gridview qui se situe lui même dans un updatepanel. Lorsque j'applique la solution ci-dessus j'ai ce message d'erreur : "Argument de publication ou de rappel non valide. La validation d'événement est activée via  dans la configuration etc ..."
0
Praxe Messages postés 9 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 13 février 2007
8 janv. 2007 à 14:47
Ok merci bien !
Ta solution est bien meilleure en effet et ça fait exactement ce que je voulais. En plus j'ai pu découvrir le .ashx grâce à toi. J'ai pas trop bien compris la solution proposée plus haut c'est vrai . Enfin j'imagine que l'astuce doit être dans la fonction GetPostBackEventReference. En gros la fonction où il y a tous les response machin est appelé par le linkbutton qui, lui, est situé en dehors de l'updatepanel.
Encore merci !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
8 janv. 2007 à 15:10
non meme pas la solution plus haut réinvente la roue et fais du grand n'importe quoi, tu peux oublier sans soucis.

<hr />Cyril - MVS - MCP
0
magicbassfr Messages postés 1 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 5 mars 2008
5 mars 2008 à 13:17
Bonjour,

j'ai appliqué la méthode via un ashx dont voici le code:

public void ProcessRequest (HttpContext context)
{
      string fileName = System.IO.Path.Combine(FileSystem.XlsDirectory, context.Server.HtmlDecode(context.Request.QueryString[0]) + ".xls");
       
      context.Response.ClearHeaders();
      context.Response.Clear();
      context.Response.ContentType = "application/vnd.ms-excel";
      context.Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
      context.Response.WriteFile(fileName);
      context.Response.End();
}

J'appelle le handler via un Response.Redirect(....ashx);

Et globalement ça marche bien (merci!)  mais internet explorer bloque systématiquement le premier transfert
(popup en haut: "pour des raisons de sécurité Internet Explorer a bloqué le téléchargement...")

Je ne comprends pas pourquoi ce comportement ne survient que dans ce cas: j'ai essayé la même procédure
sans ahsx et hors updatePanel, tout se passe impec... visiblement c'est lié à UpdatePanel/ashx.

Je sèche complètement.

Vous pouvez m'aider?
merci d'avance.
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
5 mars 2008 à 13:41
Ca vient du window.open, malheureusement je ne vois pas trop de solution. C'est la meme chose que l'anti popup.

<hr />Cyril - MSP - MCPD ASP.net & MCTS SQL - Consultant indépendant
0
cs_karn Messages postés 79 Date d'inscription mardi 2 avril 2002 Statut Membre Dernière intervention 6 juillet 2009
16 déc. 2008 à 16:10
Bonjour, j'ai eu besoin d'une même solution pour pouvoir télécharger des fichiers dans une page ajax. Les fichiers etant dans un imagebutton lui meme dans un datagrid.

voila la solution en 1 ligne :

ScriptManager1.RegisterPostBackControl(monDataGrid)

cela permet d'enregistrer le controle qui autorisera le post complet de la page et non plus partiellement.

dans ce cas, la pagination du datagrid ne fonctionne plus en ajax, la solution est d'enregistrer uniquement l'imageButton du datagrid  :

  Private Sub monDataGrid_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles monDataGrid.ItemDataBound
        If e.Item.ItemIndex >= 0 Then
            ScriptManager1.RegisterPostBackControl(e.Item.FindControl("monImageButon")) 
           End If
  End Sub
0
scilaci Messages postés 5 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 13 janvier 2009
13 janv. 2009 à 13:14
Salut, je sais que ce poste date.
Et je ne sais pas si je fais bien de posté ici.

Mais j'ai un petit problème avec un fichier ashx pour le download de fichier de type PDF

Lorsque j'affiche ma page et que je clique sur le lien du pdf à télécharger tout se passe très bien.
J'arrive à faire un "Save file as" ou un "Open file". jusque la tout vas bien.
Mais par la suite, lorsque je clique sur un autre lien qui n'a rien avoir avec le téléchargement de PDF, L'application m'affiche à nouveau le dialog box du fichier pdf  précédemment ouvert.

Si vous avez une petite idée, d'où pourrais venir le problème.

Merci pour vos future réponse.
0
Rejoignez-nous