L'utilisation Response.TransmitFile pour le fichier physique ne fonctionne pas
-
25-09-2019 - |
Question
Je suis en train de l'utilisateur du 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 de blog de Rick Strahl http://www.west-wind.com/weblog/posts/76293.aspx
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 ajaxified ... Je me demande si le Response.TransmitFile 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 n'y a 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";
}
}
La solution
Cette question est que je ne peux pas faire Response.TransmitFile () à partir d'un appel AJAX. Après avoir lu quelques blogs que j'utilise le postback async pour régler le src d'un iframe invisible. Le iframe envoie ensuite le fichier dans son cas de charge.
Autres conseils
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 fonctionner mieux.