2015-12-28 27 views
10

Tôi đang chỉnh sửa một số mã và có một phương thức trả về loại FileContentResult. Tôi nhận được một luồng từ dịch vụ, vì vậy đối với tôi, sẽ thuận tiện hơn khi thay đổi kiểu trả về thành FileStreamResult.Sự khác biệt giữa FileContentResult và FileStreamResult

Tôi có nên chuyển đổi luồng thành mảng để trả lại FileContentResult không?

Hoặc tôi có thể thay đổi kiểu trả về một cách an toàn không?

Trả lời

16

FileResult là lớp cơ sở trừu tượng cho tất cả những người khác.

  • FileContentResult - sử dụng nó khi bạn có một mảng byte bạn sẽ muốn trở lại như một tập tin
  • FileStreamResult - bạn có một dòng suối đang mở, bạn muốn quay trở lại đó là nội dung như một tập tin
12

Cả hai FileStreamResultFileContentResult được kế thừa từ FileResult được kế thừa từ ActionResult. Vì vậy, bạn có thể trở lại hoặc là một loại từ một phương pháp trong đó có ActionResult như kiểu trả

Nếu bạn đã có một dòng , bạn có thể sử dụng FileStreamResult constructor để trả về một FileResult

public ActionResult Download() 
{ 
    var f = Server.MapPath("~/Content/mypdf.pdf"); 
    var fileStream = new FileStream(f,FileMode.Open,FileAccess.Read); 
    return new FileStreamResult(fileStream, MimeMapping.GetMimeMapping(f)); 
} 

Nếu bạn đã có một byte arrray, bạn có thể sử dụng FileContentResult constructor để trả về một FileResult

public ActionResult Download() 
{ 
    var f = Server.MapPath("~/Content/mypdf.pdf"); 
    var bytes = System.IO.File.ReadAllBytes(f); 
    return new FileContentResult(bytes, MimeMapping.GetMimeMapping(f)); 
} 

Phương pháp Controller.File có quá tải mà phải mất cả một mảng byte hay một dòng

public ActionResult Download() 
{ 
    var f = Server.MapPath("~/Content/mypdf.pdf"); 
    var bytes = System.IO.File.ReadAllBytes(f); 
    return File(bytes, MimeMapping.GetMimeMapping(f)); 
} 
public ActionResult Download2() 
{ 
    var f = Server.MapPath("~/Content/mypdf.pdf"); 
    var fileStream = new FileStream(f, FileMode.Open, FileAccess.Read); 
    return File(fileStream, MimeMapping.GetMimeMapping(f)); 
} 

Nếu trình duyệt có hỗ trợ để hiển thị các kiểu nội dung của phản ứng, phản ứng sẽ được hiển thị trong trình duyệt. Ví dụ, đối với mã trên, nó sẽ hiển thị nội dung pdf trong trình duyệt.

Có một quá tải khác của phương thức File có tên tệp tải xuống mà hộp thoại lưu/tải xuống của trình duyệt sẽ sử dụng để người dùng có thể lưu máy tính cục bộ của mình và/hoặc mở.

public ActionResult Download4() 
{ 
    var f = Server.MapPath("~/Content/mypdf.pdf"); 
    var fileStream = new FileStream(f, FileMode.Open, FileAccess.Read); 
    return File(fileStream, MimeMapping.GetMimeMapping(f),"MyfileNiceFileName.pdf"); 
} 

Với điều này, người dùng sẽ nhận được lời nhắc tải xuống từ trình duyệt.

+3

Khách hàng không thể nói sự khác biệt. Máy khách không thể tìm ra lớp .NET được sử dụng để gửi các byte tới trình duyệt. – usr

+0

Điều gì sẽ xảy ra nếu tôi cần hiển thị tệp cho một phần cụ thể của trang web. Hiện tại, luồng phim sẽ hiển thị toàn bộ trang web. Chúng tôi có thể nhắm mục tiêu một khu vực nhỏ trong một trang không? – Unbreakable

+0

Tôi đoán bạn có thể thử tải trong khung nội tuyến. Không bao giờ thử bản thân mình mặc dù – Shyju

Các vấn đề liên quan