2010-09-27 5 views
3

J'essaie d'utiliser le Response.TransmitFile() pour demander un téléchargement. J'ai lu un certain nombre de postes sur la question et sur la base de ma méthode au large de blog http://www.west-wind.com/weblog/posts/76293.aspxL'utilisation de Response.TransmitFile pour le fichier physique ne fonctionne pas

Rick Strahl

La seule différence (que je peux dire) est que je vise un fichier physique en dehors du répertoire virtuel. Ce code est appelé dans un radgrid ajaxifié ... Je me demande si le fichier response.transmit ne fonctionne pas avec les appels ajax? Voici mon extrait de code:

  // Get the physical Path of the file 
      string docFilePath = (string)args.AttachmentKeyValues["DocFilePath"]; 

      // Create New instance of FileInfo class to get the properties of the file being downloaded 
      FileInfo file = new FileInfo(docFilePath); 

      // Checking if file exists 
      if (file.Exists) 
      { 
       Response.ClearContent(); 

       Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name); 


       Response.AddHeader("Content-Length", file.Length.ToString()); 


       Response.ContentType = ReturnExtension(file.Extension.ToLower()); 


       Response.TransmitFile(file.FullName); 

       Response.End(); 
      } 

Voir le système connaît le fichier existe ... il passe à travers la Response.End() sans erreur ... continue alors l'application correctement ... Sauf qu'il est pas d'invite de téléchargement.

La méthode ReturnExtension est soulevé d'un autre site (désolé, je ne me souviens pas où!) Comme suit

string ReturnExtension(string fileExtension) 
    { 
     // In the long run this should go in a class 
     switch (fileExtension) 
     { 
      case ".htm": 
      case ".html": 
      case ".log": 
       return "text/HTML"; 
      case ".txt": 
       return "text/plain"; 
      case ".doc": 
       return "application/ms-word"; 
      case ".tiff": 
      case ".tif": 
       return "image/tiff"; 
      case ".asf": 
       return "video/x-ms-asf"; 
      case ".avi": 
       return "video/avi"; 
      case ".zip": 
       return "application/zip"; 
      case ".xls": 
      case ".csv": 
       return "application/vnd.ms-excel"; 
      case ".gif": 
       return "image/gif"; 
      case ".jpg": 
      case "jpeg": 
       return "image/jpeg"; 
      case ".bmp": 
       return "image/bmp"; 
      case ".wav": 
       return "audio/wav"; 
      case ".mp3": 
       return "audio/mpeg3"; 
      case ".mpg": 
      case "mpeg": 
       return "video/mpeg"; 
      case ".rtf": 
       return "application/rtf"; 
      case ".asp": 
       return "text/asp"; 
      case ".pdf": 
       return "application/pdf"; 
      case ".fdf": 
       return "application/vnd.fdf"; 
      case ".ppt": 
       return "application/mspowerpoint"; 
      case ".dwg": 
       return "image/vnd.dwg"; 
      case ".msg": 
       return "application/msoutlook"; 
      case ".xml": 
      case ".sdxl": 
       return "application/xml"; 
      case ".xdp": 
       return "application/vnd.adobe.xdp+xml"; 
      default: 
       return "application/octet-stream"; 
     } 
    } 

Répondre

2

Ce problème est que je ne peux pas rendre Response.TransmitFile() à partir d'un appel AJAX. Après avoir lu quelques blogs, j'utilise la publication asynchrone pour définir le src d'un iframe invisible. L'iframe envoie ensuite le fichier dans son événement load.

0

Je suppose que le code fait la transmission n'a pas le droit d'ouvrir ce fichier. Pouvez-vous appeler TransmitFile avec un descripteur de fichier déjà ouvert? Cela devrait mieux fonctionner.

+0

Si le code n'a pas de droits sur le fichier, l'appel de fichier.exist ne présenterait-il pas un problème? – Matthew

+0

@Matthew PK: Pas nécessairement. De ce que je me souviens de transmitfile, il n'envoie pas le fichier du thread traitant la réponse, mais en utilisant async IO. (Quelque chose de bas niveau comme un thread noyau ouvrant le fichier et poussant les données directement dans le socket). La vérification d'accès est faite quand vous ouvrez un handle, donc si vous pouvez aller au-delà de ce point, txfile devrait être capable de faire le reste. –

Questions connexes