2011-08-23 39 views
8

Tôi đang sử dụng MVC 3 Tôi muốn tạo động tệp CSV để tải xuống, nhưng tôi không chắc chắn về cách tiếp cận định hướng MVC chính xác.Bộ điều khiển MVC Sử dụng Luồng phản hồi

Trong ASP.net thông thường, tôi sẽ có văn bản gì đó như:

Response.ClearHeaders(); 
Response.ContentType = "text/csv"; 
Response.AddHeader("content-disposition", attachment;filename='Test.csv'"); 
Response.Write("1,2,3"); 
Response.End(); 

Tôi đã xem xét các hành động ContentResult nhưng có vẻ như tôi sẽ cần phải tạo ra kết quả là một chuỗi, tức là

trả về Nội dung (myData, "text/csv");

Tôi có thể, tôi giả sử, xây dựng một chuỗi, nhưng vì các tệp này có thể dài vài nghìn dòng, điều này có vẻ không hiệu quả đối với tôi.

Ai đó có thể chỉ cho tôi đúng hướng không? Cảm ơn.

+0

Tạo loại ActionResult tùy chỉnh chi tiết trong bài đăng này: [http://stackoverflow.com/questions/989927/recommended-way-to-create-an-actionresult-with-a-file-extension?rq=1] [1] [1]: http://stackoverflow.com/questions/989927/recommended-way-to-create-an-actionresult-with-a-file-extension?rq=1 –

+0

Trông thực sự là bản sao của http://stackoverflow.com/q/943122/1178314 có một câu trả lời khá tốt imho (http://stackoverflow.com/a/13456219/1178314) –

Trả lời

5

tôi đã dành một chút thời gian vào vấn đề tương tự như ngày hôm qua, và dưới đây là cách để làm điều đó đúng cách:

public ActionResult CreateReport() 
{ 
    var reportData = MyGetDataFunction(); 
    var serverPipe = new AnonymousPipeServerStream(PipeDirection.Out); 
    Task.Run(() => 
    { 
     using (serverPipe) 
     { 
      MyWriteDataToFile(reportData, serverPipe) 
     } 
    }); 

    var clientPipe = new AnonymousPipeClientStream(PipeDirection.In, 
      serverPipe.ClientSafePipeHandle); 
    return new FileStreamResult(clientPipe, "text/csv"); 
} 
+0

bạn có chắc chắn về việc sử dụng (serverPipe) không? nó sẽ được sử dụng trong FileStreamResult (clientPipe. Điều gì xảy ra nếu tác vụ chạy nhanh chóng? – Slava

+0

@Slava hệ thống sẽ quản lý luồng dữ liệu giữa hai đầu của đường ống, do đó không phải là một mối quan tâm. Nói cách khác, nhiệm vụ sẽ không thoát ra đột ngột, nó sẽ được tổ chức tại một trong hai viết, hoặc ở gần dòng. Hãy thử nó, nó hoạt động. – galets

3

Cố gắng trở về một trong những FileResult s: http://msdn.microsoft.com/en-us/library/system.web.mvc.fileresult.aspx

Cũng xem ví dụ sau: http://forums.asp.net/t/1491579.aspx/1

+0

Tôi hiện đang sử dụng một cái gì đó tương tự với File (Encoding.UTF8.GetBytes (sb .ToString()), "text/csv", fileName) nhưng nó vẫn có vẻ như là một vấn đề tiềm năng để xây dựng toàn bộ đầu ra trong bộ nhớ trước khi cam kết với khung nhìn/phản hồi. – Neilski

+0

Điều tra các tình trạng quá tải khác của File(). Vui lòng xem các liên kết tôi đã đăng. Một số quá tải không yêu cầu bạn phải xây dựng tệp trong bộ nhớ. –

+0

Không xây dựng một mảng byte (byte []) vẫn hoàn thành dữ liệu đầu ra trong bộ nhớ trước khi cam kết nó vào tệp ActionResult? Ví dụ: return File (imageData, "image/jpeg", "fileName.jpg"); – Neilski

13

Tôi đã tìm thấy một giải pháp khả thi cho vấn đề này. Bạn có thể chỉ cần xác định phương thức hành động để trả về một EmptyResult() và ghi trực tiếp vào luồng phản hồi. Ví dụ:

public ActionResult RobotsText() { 
    Response.ContentType = "text/plain"; 
    Response.Write("User-agent: *\r\nAllow: /"); 
    return new EmptyResult(); 
} 

Điều này dường như không hoạt động. Bạn không chắc chắn như thế nào 'MVC' nó là ...

+0

Nó là một hack, một bộ điều khiển MVC không phải ghi trực tiếp vào luồng phản hồi.Đây được coi là công việc của phương thức ExecuteResult của một đối tượng kết quả hành động. –

-1

Hãy thử một cái gì đó như thế này:

public ActionResult CreateReport(string report, string writer) 
{ 
    var stream = new MemoryStream(); 
    var streamWriter = new StreamWriter(stream); 

    _generateReport.GenerateReport(report, writer); 

    streamWriter.Flush(); 
    stream.Seek(0, SeekOrigin.Begin); 

    return new FileStreamResult(stream, writer.MimeType); 
} 
+1

Điều này hoàn toàn đánh bại mục đích của Luồng. Vui lòng không làm điều này trong mã sản xuất. – makhdumi

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