Vous êtes ici Forums
  |  Connexion
 Forums
HomeHomeForums DNNForums DNNDéveloppementDéveloppementProblème de téléchargement de fichiers lié à AjaxProblème de téléchargement de fichiers lié à Ajax
Précédente
 
Suivante
Nouveau message
12/02/2008 10:00
 

Lu,

 Je viens demander vos lumières pour un souci au niveau du téléchargement d'un fichier... En effet, autant je n'ai eu aucun mal pour copier un fichier sur le serveur, autant je suis dans l'impossibilité de le télécharger...

J'ai essayé de 2 manières différentes pour le téléchargement

  • La première en me servant des classes DNN comme ceci :

                  

int iFileId = Convert.ToInt32(this.grdDocuments.DataKeys[Convert.ToInt32(e.CommandArgument)].Values["FileId"]);
if (iFileId != DotNetNuke.Common.Utilities.Null.NullInteger)
{

        DotNetNuke.Common.Utilities.FileSystemUtils.DownloadFile(this.PortalId, iFileId, false, false);

}

  • La seconde en me servant des classes du framework :

int iFileId = Convert.ToInt32(this.grdDocuments.DataKeys[Convert.ToInt32(e.CommandArgument)].Values["FileId"]);
if (iFileId != DotNetNuke.Common.Utilities.Null.NullInteger)
{
        FileController oFileController = new FileController();
        FileInfo oFileInfo = oFileController.GetFileById(iFileId, this.PortalId);
        System.IO.FileInfo oFileInfoIO = new System.IO.FileInfo(oFileInfo.PhysicalPath);

        Response.Clear();
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + oFileInfoIO.Name);
        Response.AppendHeader("Content-Length", oFileInfoIO.Length.ToString());
        Response.ContentType = "application/octet-stream";
        Response.WriteFile(oFileInfoIO.FullName);
        Response.End();

}

 

Le résultat retourné est le suivant dans les 2 cas :

Etant donné que le sujet est un peu nouveau pour moi, peut être ais-je fait une grosse boulette et que ce n'est finalement pas grand chose, ce qui m'arrangerai d'ailleurs...

Voilà, encore merci pour votre aide...

++

 
Nouveau message
12/02/2008 11:00
 

Re,

J'ai peut être un peu de nouveau... J'ai l'impression que ce problème n'est pas lié au téléchargement lui même mais au fait d'appeler la méthode Response.Write() car j'ai voulu mettre en place un popup d'avertissement basique et j'ai eu exactement le même message d'erreur que pour le téléchargement...

++

 
Nouveau message
12/02/2008 12:51
 

Re,

Toujours en quête de solution, j'avance doucement mais sûrement...

Apparemment le problème viendrait d'ajax dont la syntaxe de réponse serait différente de l'HTTP... Ca ne m'avance pas forcément plus car il va falloir visiblement se servir de méthodes du ScriptManager pour effectuer l'équivalent d'un Response.Redirect, mais vu que le dit ScriptManager est noyé dans les confins de DotNetNuke, je me demande encore comment je vais pouvoir y accéder...

En voilà un peu plus sur le sujet :

blogs.developpeur.org/cyril/archive/2007/05/13/updatepanel-et-pagerequestmanagerparsererrorexception.aspx

 

++

 

 
Nouveau message
14/02/2008 14:56
 

Bonjour,

peux tu nous en dire plus sur ton problème? j'entend par là, par quel moyen comptes-tu renvoyer ton fichier?

soit tu veux faire un lien sur un fichier existant, soit sur un fichier généré à la volée. selon ta réponse je te donnerai la solution :) (avec une génération de fichier excel par exemple et en ajax biensur, j'utilise les méthodes de HttpContext.Current.Response)

un exemple rapide mais ca n'est pas dans l'environnement DNN, donc a revoir selon ce que tu me répondras :

    public void SendExcel(DataSet dataSet, string fileName)
    {
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.ContentEncoding = Encoding.UTF7;
        HttpContext.Current.Response.Buffer = true;
        HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddSeconds(1));
        HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
        HttpContext.Current.Response.Charset = "";

        StringWriter sw = new StringWriter();
        HtmlTextWriter tw = new HtmlTextWriter(sw);

        DataGrid export = new DataGrid();
        export.DataSource = dataSet;
        export.AllowSorting = false;
        export.DataBind();
        export.RenderControl(tw);

        HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + fileName + ".xls");
        HttpContext.Current.Response.Write(sw.ToString());
        HttpContext.Current.Response.End();
    }

dans cet exemple j'renvoi un fichier excel contenant tout le datagrid :)


Merci de donner un minimum de détails quand vous posez des questions (version de dnn, etc.)
 
Nouveau message
14/02/2008 17:54
 

Je ne sais pas si ça d'aidera.

Mais, dans le cadre d'utilisation d'ajax (updatepanel) certaine choses ne fonctionne pas comme le FileUpload.

Il est nécessaire de forcé un postback.

ScriptManager.GetCurrent(Page).RegisterPostBackControl(Upload1); 

Ton cas est peutêtre similaire ????


Sacha
 
Nouveau message
15/02/2008 08:23
 

st2 a dit

Je ne sais pas si ça d'aidera.

Mais, dans le cadre d'utilisation d'ajax (updatepanel) certaine choses ne fonctionne pas comme le FileUpload.

Il est nécessaire de forcé un postback.

ScriptManager.GetCurrent(Page).RegisterPostBackControl(Upload1); 

Ton cas est peutêtre similaire ????

 

c'est surtout qu'il faut savoir que l'update panel rejoue tout le code coté serveur. personnellement je ne m'en sers jamais.


Merci de donner un minimum de détails quand vous posez des questions (version de dnn, etc.)
 
Nouveau message
15/02/2008 08:41
 

Lu,

Merci pour votre aide, en fait je récupère le contenu d'un treeview ou le résultat d'une recherche multicritères dans un gridview qui lui contient des documents... Lorsque je veux télécharger le document désiré, c'est à ce moment là que l'erreur décrite dans le premier post se produit... Je cherche à télécharger le fichier physique associé au document... J'espère que j'ai pu préciser un peu... Voici le GridView contenant les documents :

Encore merci pour l'aide que vous m'apportez et que vous pourrez m'apporter

++

 

 
Nouveau message
20/02/2008 09:33
 

Lu,

Bon suite et fin de la saga, visiblement quand on ajaxifie une page, on ne peut pas se servir de Response.Write, response filters et HttpModules...

J'ai lu qu'une solution était de sortir le contrôle de téléchargement de l'UpdatePanel afin de pouvoir le faire de manière "classique asp.net"... Or lorsqu'on active le rendu partiel d'un ascx DotNetNuke, on l'encapsule dans un UpdatePanel... Ma solution a donc été de me servir d'un formulaire de visualisation des détails d'un document (quand on clique sur la loupe du GridView) pour y gérer son téléchargement puisque ce dernier n'était pas ajaxifié... J'ai donc supprimé le téléchargement direct via le GridView...

Je me posais également la question de savoir s'il n'était pas possible de se passer de la gestion du rendu partiel de DotNetNuke pour poser soi-même son ScriptManager et ses UpdatePanel dans les ascx pour pouvoir justement ne plus avoir ce problème d'encapsulation globale...

++

 
Nouveau message
06/03/2008 10:27
 

Lu,
volià le problème du téléchargement direct depuis un formulaire ajaxifié est résolu...Le téléchargement marche grâce au httpHandler... Ca n'aura pas été une mince affaire de le mettre en oeuvre...

Voilà donc comment j'ai procédé, en espérant que ce soit le plus juste possible et que ça puisse aider les autre...

Je garde exprès le nom que j'ai donné à ma classe et mes variables pour garder une certaine cohérence, mais c'est juste un exemple...

Tout d'abord,  j'ai créé une classe dans le répertoire asp.net App_Code DownloadFileHandler :

using System.Web;
using DotNetNuke.Common.Utilities;
using System.Web.SessionState;
using System;

namespace Sedoc.Modules.BaseReglementaire
{
    public class DownloadFileHandler : IHttpHandler
    {
        public DownloadFileHandler()
        {
        }
        public void ProcessRequest(HttpContext context)
        {
            HttpRequest Request = context.Request;

            // Controle qu'il y a bien les deux paramètres non nuls
            if ((Int32.Parse(Request.QueryString["FileID"]) != DotNetNuke.Common.Utilities.Null.NullInteger) && (Int32.Parse(Request.QueryString["PortalID"]) != DotNetNuke.Common.Utilities.Null.NullInteger))
            {
                int iFileId = Int32.Parse(Request.QueryString["FileID"]);
                int iPortalId = Int32.Parse(Request.QueryString["PortalID"]);

                // Téléchargement du fichier
                FileSystemUtils.DownloadFile(iPortalId, iFileId, false, true);
            }
        }
        public bool IsReusable
        {
            // To enable pooling, return true here.
            // This keeps the handler in memory.
            get { return false; }
        }
    }
}


Ensuite je fais mon appel dans le code sur lors de l'évènement lié au clic du téléchargement :


// Construction de la QueryString en intégrant les id du portail et du fichier
string sQueryString = "window.open('Download.ashx?FileID=" + iFileId.ToString() + "&PortalID=" + this.PortalId + "');";

ScriptManager.RegisterStartupScript(this, this.GetType(), "download", sQueryString, true);


]N.B. : Je ne sais juste pas trop à quoi sert le "download" qui est censé être une clé (string key), mais de quoi ?? passé en paramètre dans le RegisterStartupScript mais ça fonctionne à merveille, alors...

Enfin, j'ai déclaré le httpHandler dans le web.config dans la section <httpHandlers> comme ceci :


<add verb="*" path="*.ashx" type="Sedoc.Modules.BaseReglementaire.DownloadFileHandler"/>



Voilà, je tenais à faire partager mon retour d'expérience car je suis resté bloqué plus de deux jours sur un problème qui maintenant connu me prendra 30 mn au plus à remettre en place si le cas se représente :)

Par contre si quelqu'un à une idée ou pourrait me dire comment faire en sorte pour que la déclaration du httpHandler dans le web.config soit faite par le script d'installation du module (.dnn), je lui en serais énormément reconnaissant... Et si ce n'est pas possible, tant pis il faudra le faire à la main...


++

 
Précédente
 
Suivante
HomeHomeForums DNNForums DNNDéveloppementDéveloppementProblème de téléchargement de fichiers lié à AjaxProblème de téléchargement de fichiers lié à Ajax