2011-11-28 47 views
11

Đây là mã để tải xuống tệp.Cách mở tệp PDF trong tab hoặc cửa sổ mới thay vì tải xuống tệp (sử dụng asp.net)?

System.IO.FileStream fs = new System.IO.FileStream(Path+"\\"+fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); 
byte[] ar = new byte[(int)fs.Length]; 
fs.Read(ar, 0, (int)fs.Length); 
fs.Close(); 

Response.AddHeader("content-disposition", "attachment;filename=" + AccNo+".pdf"); 
Response.ContentType = "application/octectstream"; 
Response.BinaryWrite(ar); 
Response.End(); 

Khi mã này được thực thi, nó sẽ yêu cầu người dùng mở hoặc lưu tệp. Thay vào đó, tôi cần phải mở tab hoặc cửa sổ mới và hiển thị tệp. Làm thế nào tôi có thể đạt được điều này?

LƯU Ý:

File sẽ không cần thiết được đặt trong thư mục trang web. Nó có thể nằm trong một thư mục khác.

+4

Bạn có thể thử 'nội dung bố trí: inline' thay vì' tệp đính kèm' - [Xem bài viết này] (http://dotanything.wordpress.com/2008/05/30/content-disposition-attachment-vs-inline /) –

+0

bài viết này có thể giúp bạn http://aspalliance.com/259_downloading_files__forcing_the_file_download_dialog –

Trả lời

3

này có thể giúp

Response.Write("<script>"); 
Response.Write("window.open('../Inventory/pages/printableads.pdf', '_newtab');"); 
Response.Write("</script>"); 
+0

Tôi sẽ gọi tệp tải xuống đó như thế nào ?? đó là vấn đề của tôi. – smilu

+0

@smilu r u lưu tệp hoặc chỉ tạo tệp để đọc ?? – Karthik

+0

Tôi nên tạo nó để đọc và sau đó nó cũng có thể được lưu lại. Vấn đề là tôi không thể cung cấp tên gốc của tệp hoặc đường dẫn quá với tệp. Vì vậy, tôi phải làm bước trên để tải xuống và sau đó mở nó bằng một tên khác. – smilu

14

Thay vì tải một dòng vào một mảng byte và ghi nó vào dòng Đáp lại, bạn nên có một cái nhìn tại HttpResponse.TransmitFile

Response.ContentType = "Application/pdf"; 
Response.TransmitFile(pathtofile); 

Nếu bạn muốn PDF để mở trong cửa sổ mới, bạn sẽ phải mở trang tải xuống trong cửa sổ mới, ví dụ như sau:

<a href="viewpdf.aspx" target="_blank">View PDF</a> 
+0

Bước đầu tiên tôi quan tâm để biết thêm. Bước thứ hai là không thực tế trong chương trình của tôi. bcz tôi không thể gửi đường dẫn ban đầu đến nó. Sử dụng bước đầu tiên tôi có thể chuyển hướng tệp đến cửa sổ khác không? – smilu

+3

Bạn không thể mở một cửa sổ mới từ phía máy chủ. Bạn sẽ phải mở trang tải xuống trong một cửa sổ mới và trong cửa sổ đó sử dụng TransmitFile để trả lại tệp cho người dùng. – janzi

+0

liên kết của bạn trông như thế nào? Tại sao bạn không thể thêm mục tiêu vào nó? Bạn có thể thêm nó bằng JavaScript nếu vì một số lý do bạn không thể thay đổi nguồn của thẻ (ví dụ: nguồn được tạo cho bạn) –

-4

Sử dụng mã này. Điều này hoạt động như một nhà vô địch.

Process process = new Process(); 
process.StartInfo.UseShellExecute = true; 
process.StartInfo.FileName = outputPdfFile; 
process.Start(); 
+0

Tôi đã thử phương pháp này và nó hoạt động thực sự tốt, cảm ơn :) – JohnnyBizzle

+9

Mã C# của bạn chạy trên máy chủ. Vì vậy, Process.Start bắt đầu một quá trình trên máy chủ, không phải máy tính của bạn. Về cơ bản, bạn không thể bắt đầu quy trình trực tiếp trên máy khách. – dnxit

+3

Có, câu trả lời này là hoàn toàn sai. –

1

Bạn phải tạo một trang hoặc trình xử lý chung khác với mã để tạo pdf của mình. Sau đó, sự kiện đó được kích hoạt và người đó được chuyển hướng đến trang đó.

4
Response.ContentType = contentType; 
HttpContext.Current.Response.AddHeader("Content-Disposition", "inline; filename=" + fileName); 
Response.BinaryWrite(fileContent); 

<asp:LinkButton OnClientClick="openInNewTab();" OnClick="CodeBehindMethod".../> 

trong JavaScript:

<script type="text/javascript"> 
    function openInNewTab() { 
     window.document.forms[0].target = '_blank'; 
     setTimeout(function() { window.document.forms[0].target = ''; }, 0); 
    } 
</script> 

Hãy cẩn thận khi reset mục tiêu, nếu không tất cả các cuộc gọi khác như Response.Redirect sẽ mở trong một tab mới, mà có thể được không bạn muốn gì.

0

bạn có thể trả về một FileResult từ hành động MVC của mình.

********************* hành động MVC ************

public FileResult OpenPDF(parameters) 
    { 
     //code to fetch your pdf byte array 
     return File(pdfBytes, "application/pdf"); 
    } 

*** js *********** **************

Sử dụng formpost để gửi dữ liệu của bạn để hành động

var inputTag = '<input name="paramName" type="text" value="' + payloadString + '">'; 
    var form = document.createElement("form"); 
    jQuery(form).attr("id", "pdf-form").attr("name", "pdf-form").attr("class", "pdf-form").attr("target", "_blank"); 
    jQuery(form).attr("action", "/Controller/OpenPDF").attr("method", "post").attr("enctype", "multipart/form-data"); 
    jQuery(form).append(inputTag); 
    document.body.appendChild(form); 
    form.submit(); 
    document.body.removeChild(form); 
    return false; 

bạn cần phải tạo biểu mẫu để đăng dữ liệu của bạn, thêm nó vào vị trí của bạn, đăng dữ liệu của bạn và xóa biểu mẫu thân tài liệu của bạn.

Tuy nhiên, bài đăng biểu mẫu sẽ không đăng dữ liệu lên tab mới chỉ trên trình duyệt EDGE.Nhưng một yêu cầu yêu cầu hoạt động vì nó chỉ mở tab mới có chứa chuỗi truy vấn chứa url cho các thông số hành động của bạn.

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