سؤال

يحتوي ASP.NET على أربعة أنواع مختلفة من نتائج الملفات:

  • FileContentResult: يرسل محتويات ملف ثنائي إلى الاستجابة.
  • FilePathResult: يرسل محتويات ملف إلى الاستجابة
  • Fileresult: إرجاع الناتج الثنائي للكتابة إلى الاستجابة
  • FileStreamResult: يرسل المحتوى الثنائي إلى الاستجابة باستخدام مثيل دفق

تأخذ هذه الأوصاف من MSDN وباستثناء FileStreamResult أول ثلاثة صوت متطابق. إذن ما هو الفرق بينهما؟

هل كانت مفيدة؟

المحلول

FileResult هي فئة قاعدة مجردة لجميع الآخرين.

  • FileContentResult - يمكنك استخدامها عندما يكون لديك صفيف بايت ترغب في العودة كملف
  • FilePathResult - عندما يكون لديك ملف على القرص وترغب في إرجاع محتواها (تقوم بإعطاء مسار)
  • FileStreamResult - لديك دفق مفتوح، تريد إرجاع محتواها كملف

ومع ذلك، سوف نادرا ما عليك استخدام هذه الفئات - يمكنك فقط استخدام واحدة من Controller.File الزائد والسماح ASP.NET MVC تفعل السحر بالنسبة لك.

نصائح أخرى

سؤال عظيم ... ويستحق المزيد من التفاصيل. أجد نفسي هنا نتيجة لحالة مثيرة للاهتمام. كنا نقدم بعض مرفقات PDF عبر بيئة MVC3 / C #. حصلت كودنا الذي تم إصداره وبدأنا في الحصول على بعض الردود من عملائنا أن التنزيلات كانت تتصرف بغرابة عندما كانوا يستخدمون Chrome ويتم تحويل نوع الملف إلى "PDF-، المرفق. pdf-، المرفق". نعم ... لقد حصلت عليه ... كل شيء. لذلك، يمكن للمرء إعادة كتابةه للحصول على "PDF" فقط وسيظل الملف ينقذ سليمة، ولكن ما هي الفوضى!

لذلك، لوصف الوضع الأولية، كنا نقوم بإعداد رأس "التصرف في المحتوى" ثم إرجاع FileContentResult ...

var cd = new System.Net.Mime.ContentDisposition
            {
                FileName = result.Attachment.FileName,
                Inline = false
            };
            Response.AppendHeader("Content-Disposition", cd.ToString());

return File(result.Attachment.Data, MimeExtensionHelper.GetMimeType(result.Attachment.FileName), result.Attachment.FileName);

بدا جيدا. عملت بشكل جيد في IE. لذلك قمت ببعض الأبحاث وحاول تنفيذ FileStreamResult بدلا من ذلك (الحفاظ على مجموعة التخلص من المحتوى):

MemoryStream dataStream = new MemoryStream();
dataStream.Write(result.Attachment.Data, 0, result.Attachment.Data.Length);
dataStream.Position = 0;
return new FileStreamResult(dataStream, MimeExtensionHelper.GetMimeType(result.Attachment.FileName));

انها ثابتة القضية في الكروم! هممم ... ولكن لماذا في هيك يجب علي أن أتناول صفيف بايت جيدة تماما وتدفقه ثم أعده عبر هذا للحصول على اسم الملف للعمل الصحيح؟

ثم جاء اللفافة.

مع FileContentResult، حصلت على تصنيف 2 محتوى في الرأس. مع FileStreamResult، حصلت على 1.

يلفظ FileContentResult رأس التخلص من المحتوى عند توفير اسم الملف والكروم يعتبر مضاعفات هذا الرأس كخطأ.

رد فعل غريب ... ولكن بالتأكيد واحد من الجيد أن نعرف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top