باستخدام استجابة. transmitfile للملف المادي لا يعمل
-
25-09-2019 - |
سؤال
أحاول استخدام الاستجابة. transmitfile () للمطالبة بتنزيل. لقد قرأت عددًا من المنشورات حول هذه القضية وأعتمدت طريقتي قبالة مدونة ريك ستراهلhttp://www.west-wind.com/weblog/posts/76293.aspx
الفرق الوحيد (الذي يمكنني قوله) هو أنني أستهدف ملفًا فعليًا خارج الدليل الافتراضي. يتم استدعاء هذا الرمز في Radgrid Ajaxified ... أتساءل عما إذا كان Response.Transmitfile لا يعمل مع مكالمات Ajax؟ هنا هو قصاصة الكود الخاصة بي:
// 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();
}
راجع النظام يعرف أن الملف موجود ... إنه يصل إلى Response.end () دون خطأ ... ثم يواصل التطبيق بشكل صحيح ... باستثناء عدم وجود موجه تنزيل.
يتم رفع طريقة العودة من موقع آخر (آسف لا أستطيع تذكر أين!) على النحو التالي
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";
}
}
المحلول
هذه المسألة هي أنه لا يمكنني إجراء استجابة. بعد قراءة بعض المدونات ، أستخدم Postback Async لتعيين SRC لـ Iframe غير المرئي. Iframe ثم يرسل الملف في حدث التحميل الخاص به.
نصائح أخرى
أظن أن الكود الذي يقوم بالإرسال ليس لديه حقوق فتح هذا الملف. هل يمكنك استدعاء Transmitfile مع مقبض ملف مفتوح بالفعل؟ يجب أن يعمل هذا بشكل أفضل.