2013-04-07 9 views
12

Sau đây trả về một tệp PDF mà trình duyệt cố gắng hiển thị trực tiếp nội tuyến. Điều này hoạt động chính xác. Tuy nhiên, nếu tôi cố gắng tải xuống tệp, tên tải xuống không phải là "myPDF.pdf", mà thay vào đó là ID trong tuyến đường (myapp/controller/PDFGenerator/ID). Có thể đặt tên tải xuống tệp thành "myPDF.pdf" không?ASP.NET MVC FileStreamResult, fileDownloadName không được sử dụng

public FileStreamResult PDFGenerator(int id) 
{ 
    MemoryStream ms = GeneratePDF(id); 

    byte[] file = ms.ToArray(); 
    MemoryStream output = new MemoryStream(); 
    output.Write(file, 0, file.Length); 
    output.Position = 0; 
    HttpContext.Response.AddHeader("content-disposition", 
    "inline; filename=myPDF.pdf"); 

    return File(output, "application/pdf", fileDownloadName="myPDF.pdf"); 
} 

Trả lời

15

Không, điều này là không thể với nội dung PDF được hiển thị nội tuyến. Bạn có thể đạt được điều này nếu bạn gửi header Content-Disposition với dưới dạng đính kèm:

public ActionResult PDFGenerator(int id) 
{ 
    Stream stream = GeneratePDF(id); 
    return File(stream, "application/pdf", "myPDF.pdf"); 
} 

Cũng cần chú ý làm thế nào tôi gỡ bỏ không cần thiết MemoryStream bạn đang sử dụng và tải PDF trong bộ nhớ nơi mà bạn có thể có trực tiếp xem trực tiếp nó vào khách hàng sẽ có hiệu quả hơn rất nhiều.

+0

Vâng, đó là toàn bộ các điểm câu trả lời của tôi. Nếu bạn muốn tệp được hiển thị nội tuyến, bạn ** không thể chỉ định tên tệp. Nếu bạn hiển thị tệp PDF nội dòng, tệp được mở bằng plugin được liên kết trên máy khách để mở tệp PDF. Hành vi sẽ khác nhau giữa các plugin khác nhau. –

+0

@Nalan M trả lời có thể buộc nó tải xuống, trong hầu hết các trường hợp. Vì vậy, nó không nên được nói là không thể. –

+0

Một câu hỏi, ai sẽ xử lý luồng ở đây? – Legends

4

Nếu bạn đang sử dụng FileStreamResult để tải về các tập tin, hãy thử sử dụng này trong điều khiển

Response.ContentType = "application/pdf"; 
Response.AddHeader("Content-Disposition", "attachment; filename=FileName.pdf"); 
+0

Trên các hoạt động xuất của tôi sang PDF, trả về dữ liệu dưới dạng văn bản thuần túy ** thay thế ** iframe ** thay vì loại tệp đính kèm. Tôi đã phải thêm hai dòng này để buộc nó bật lên hộp thoại lưu. – OldTrain

0

Có thể bằng cách làm cho id một chuỗi đại diện cho tên tập tin mà không có phần mở rộng.

public ActionResult PDFGenerator(string id, int? docid) 
{ 
    Stream stream = GeneratePDF(docid); 
    return new FileStreamResult(stream , "application/pdf"); 
} 

Url rồi sau đó kết thúc như thế này

..PDFGenerator/Document2?docid=15