ASP.NET MVC dört dosya sonuçları arasındaki fark nedir


136

ASP.NET'in dört farklı dosya sonucu türü vardır:

  • FileContentResult: İkili dosyanın içeriğini yanıta gönderir.
  • FilePathResult: Bir dosyanın içeriğini yanıta gönderir
  • FileResult: Yanıtı yazmak için ikili çıktı döndürür
  • FileStreamResult: Bir Stream örneği kullanarak yanıta ikili içerik gönderir

Bu açıklamalar MSDN'den alınır ve FileStreamResult dışında ilk üç ses aynıdır. Peki aralarındaki fark nedir?

Yanıtlar:


176

FileResult diğerleri için soyut bir temel sınıftır.

  • FileContentResult - dosya olarak döndürmek istediğiniz bir bayt diziniz olduğunda kullanırsınız
  • FilePathResult - diskte bir dosyanız varsa ve içeriğini döndürmek istediğinizde (bir yol verirsiniz)
  • FileStreamResult - açık bir akışınız var, içeriğini bir dosya olarak döndürmek istiyorsunuz

Ancak, nadiren bu sınıfları kullanmak zorunda kalacaksınız - sadece Controller.Fileaşırı yüklerden birini kullanabilir ve ASP.NET MVC'nin sihri sizin için yapmasına izin verebilirsiniz .


29

Harika bir soru ... ve daha fazla detayı hak ediyor. Kendimi burada ilginç bir durumun sonucu olarak buluyorum. MVC3 / C # ortamı üzerinden bazı pdf eklerini teslim ediyorduk. Kodumuz yayınlandı ve müşterilerimizden indirmelerin Chrome kullanırken garip davrandığını ve dosya türünün 'pdf-, attachment.pdf-, attachment' biçimine dönüştürüldüğünü gösteren bazı yanıtlar almaya başladık. Evet ... anladın ... her şeyi. Yani, sadece 'pdf' olarak yeniden yazılabilir ve dosya hala bozulmadan kaydedilebilir, ama ne dağınıklık!

Bu nedenle, başlangıç ​​durumunu tanımlamak için 'Content-Disposition' başlığını ayarlayıp ardından bir FileContentResult döndürüyoruz ...

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);

İyi görünüyordu. IE'de iyi çalıştı. Bu yüzden biraz araştırma yaptım ve bunun yerine FileStreamResult'u uygulamayı denedim (Content-Disposition setter'ı tutarak):

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));

Chrome'daki sorunu düzelttim! Hmmm ... ama neden heck'te mükemmel iyi bayt dizimi alıp yayınlamalıyım ve daha sonra dosya adının doğru çalışmasını sağlamak için bu yolla geri dönmeliyim?

Sonra Fiddler geldi.

FileContentResult ile, üstbilgide 2 Content-Disposition var. FileStreamResult ile 1 aldım.

FileContentResult, Dosya Adı sağlanırken bir Content-Disposition üstbilgisi ekler ve Chrome bu üstbilginin katlarını bir hata olarak görür.

Garip bir tepki ... ama kesinlikle bilmek iyi.


3
Sadece bir ipucu, .NET 4+ System.Web.MimeMapping.GetMimeMapping(filename)sürümünde, mime türünü kolayca erişemezseniz toplamak için kullanabilirsiniz .
GONeale

4
Bir Filesonuca dosya adı sağlamak FileDownloadName, Content-Dispositionüstbilgiyi sizin için ayarlayan özelliğini ayarlamak anlamına gelir . ContentDispositionSınıfı desteklemeyen utf-8 dosya adlarını doğru bir şekilde destekliyor ( daha fazla bilgi için buradaki yorumuma bakın ).
Frédéric

1
Evet, teşekkür ederim @ Frédéric, tüm SO mesajlarından yalnız ne olduğunu bana anlattın!
Nacht
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.