Mit Response.TransmitFile für physische Datei nicht funktioniert
-
25-09-2019 - |
Frage
Ich bin zu Benutzer versucht, die Response.TransmitFile (), um prompt ein Download. Ich habe eine Reihe von Beiträgen zu diesem Thema gelesen und anhand meiner Methode aus Rick Strahl Blog http://www.west-wind.com/weblog/posts/76293.aspx
Der einzige Unterschied (das ich sagen kann) ist, dass ich eine physische Datei außerhalb des virtuellen Verzeichnisses bin Targeting. Dieser Code wird in einem ajaxified RadGrid genannt ... Ich frage mich, ob die Response.TransmitFile funktioniert nicht mit Ajax-Aufrufen? Hier ist mein Code-Snippet:
// 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();
}
Sehen Sie das System weiß, die Datei vorhanden ist ... es wird bis zum Response.End () ohne Fehler ... dann die App weiterhin richtig ... Außer es keine Download-Aufforderung ist.
Die ReturnExtension Methode von einer anderen Seite angehoben wird (sorry ich kann mich nicht erinnern, wo!) Wie folgt
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";
}
}
Lösung
Dieses Problem ist, dass ich nicht Response.TransmitFile () von einem AJAX-Aufruf machen. Nach ein paar Blogs zu lesen verwende ich die async Postbacks die src eines unsichtbaren iframe einzustellen. Der iframe sendet dann die Datei in ihrem Ladeereignis.
Andere Tipps
Ich würde vermuten, dass der Code die Transmit tun nicht die Rechte hat, diese Datei zu öffnen. Können Sie TransmitFile mit einem bereits geöffneten Datei-Handle nennen? Das sollte besser funktionieren.