2010-02-01 10 views
1

J'ai donc une page sur laquelle je génère dynamiquement une table et des boutons de liaison dans un grand UpdatePanel. Chaque bouton de lien lorsque vous cliquez dessus entraînera l'appel de cette méthode. L'objectif est de faire pointer le lien vers un fichier dans ma base de données et de cliquer sur cette option pour permettre à l'utilisateur d'ouvrir/enregistrer ce fichier. Cette méthode fonctionne très bien sur une autre page de mon site avec généralement la même configuration mais sur celui-ci je reçois:Télécharger le fichier par programme ASP.NET

Erreur d'exécution de Microsoft JScript: Sys.WebForms.PageRequestManagerParserErrorException: Le message reçu du serveur n'a pas pu être analysé . Les causes courantes de cette erreur sont lorsque la réponse est modifiée par les appels à Response.Write(), les filtres de réponse, HttpModules ou la trace du serveur est activée. Détails: Erreur d'analyse près de '% PDF-1.3 % 1 0 ob'.

public void downloadFile(int fileID) 
    { 
     using (SurveyDataContext context = new SurveyDataContext()) 
     { 
      try 
      { 
       var file = context.tblFiles.Single(f => f.FileID == fileID); 
       Response.Clear(); 
       Response.Buffer = true; 
       Response.BufferOutput = true; 
       Response.ContentType = file.MIMEtype; 
       Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + file.FileName.Trim() + "\""); 
       Response.AddHeader("Extension", file.FileName.Substring(
        file.FileName.LastIndexOf('.') + 1).ToLower()); 
       Response.BinaryWrite(file.FileData.ToArray()); 

       Response.Flush(); 
       Response.End(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       Console.WriteLine(e.InnerException); 
      } 
     } 
    } 

Qu'est-ce que je fais mal? Je ne fais pas de Response.Writes ou quoi que ce soit. Cette méthode est la seule qui touche la réponse. Y a-t-il un autre moyen de le faire?

Répondre

0

J'ai réalisé ce que je faisais mal ... Je dois faire en sorte que chaque bouton de lien ait un PostBackTrigger. Une fois que je l'ai fait, tout a fonctionné de la manière originale que j'avais.

0

Vous devriez essayer Response.Flush avant Response.End si cela ne code que vous avez alors pas travailler exemple ici à http://dotnetperls.com/response-binarywrite-aspnet

+0

J'ai essayé d'ajouter Response.Flush et il n'a pas aidé. Je ne vois pas la différence entre mon code et l'échantillon Excepté j'utilise Response.BinaryWrite et ils utilisent Response.FileWrite mais je n'ai pas de fichier sur le système de fichiers, donc FileWrite ne fonctionnera pas. – jamone

0

Look here

Vous avez probablement mis mauvais type de contenu

+0

Non le type de contenu est correct application/pdf dans ce cas précis – jamone

+0

Et vous faites quelque chose avec le fichier téléchargé en Javascript? –

0

Est-ce que l'appel Response.Clear(); avant tout le reste? Sinon, here's a blog post qui va dans un autre dépannage.

+0

Non, ce n'est pas le cas. – jamone

0

Je pense que le problème est dû à la définition de Response.Buffer et Response.BufferOutput. BufferOutput seul est probablement ce que vous voulez.

Si la suppression de Response.Buffer ne fonctionne pas, j'essayerais de simplifier un peu en définissant ContentType = "application/octet-stream" et en commentant l'en-tête "Extension". L'extension sur le nom de fichier seul devrait suffire pour le navigateur.

+0

J'ai juste essayé votre suggestion et rien ne change. – jamone

0

Avez-vous un UpdatePanel ou quelque chose comme ça?

Si tel est votre cas, vous pouvez le faire à la page charge:

ScriptManager _scriptManager = ScriptManager.GetCurrent(this.Page); 
_scriptManager.RegisterPostBackControl(Button1);