2011-09-28 39 views
9

Câu hỏi của tôi cũng tương tự như Download and open pdf file using Ajaxgọi JQuery Ajax cho file PDF download

Nhưng không giống hệt nhau, lý do tôi muốn có một ajax JQuery là tập tin của tôi đang được tạo ra tự động từ các dữ liệu đó sẽ được lấy từ cùng một trang.

Vì vậy, về cơ bản tôi có một đối tượng Json cần được gửi đến máy chủ sẽ tự động tạo tệp và gửi lại cho trình duyệt.

Tôi không muốn sử dụng chuỗi truy vấn trên một neo với đối tượng Json của tôi stringyfied, vì tôi nghĩ rằng đó sẽ là mối đe dọa tiềm năng vì chuỗi truy vấn có giới hạn ký tự (tôi có ở đây không?).

Vui lòng cho tôi biết Nếu quy trình làm việc của tôi là đúng hoặc tôi có thể đạt được điều tương tự bằng cách sử dụng luồng khác.

Trả lời

8

Bạn không nên sử dụng AJAX để tải xuống tệp. Điều này không hoạt động. Đây được cho biết bạn là trái với 2 lựa chọn: liên kết và chuỗi truy vấn các thông số

  1. hành động hoặc nếu tải phải được trigerred tại một số sự kiện javascript cụ thể mà bạn cũng có thể thiết lập các window.location.href với hành động đó là nghĩa vụ để tạo ra Tệp PDF và chuyển các tham số chuỗi truy vấn đến nó.

  2. hoặc nếu bạn sợ rằng bạn có rất nhiều dữ liệu để vượt qua các hành động điều khiển sẽ tạo ra PDF để tải về bạn sử dụng một <form> với method="POST" và bên trong bạn sử dụng các trường ẩn để lưu trữ càng nhiều thông số và dữ liệu như bạn như:

    @using (Html.BeginForm("download", "home")) 
    { 
        ... hidden fields containing values that need to be sent to the server 
        <input type="submit" value="Download PDF" /> 
    } 
    
+0

Darin: bạn nghĩ gì về việc tạo tệp trên máy chủ bằng yêu cầu AJAX GET? Điều này cho phép tôi nắm bắt bất kỳ lỗi nào xảy ra trên máy chủ trong quá trình tạo tệp trong cuộc gọi lại không thành công và hiển thị nó cho người dùng. Nếu thành công, tôi sau đó chuyển tên tập tin vào thành công ajax callback và làm 'window.location = server \ folder \ filename'. Tôi đang làm việc với ASP.NET Web API ở đây. –

+0

OP được yêu cầu cụ thể cho ajax. Đây là một sự lãng phí băng thông. – CodeWarrior

+0

@OmarPadilla, bạn không thể tải xuống tệp bằng AJAX cho ứng dụng khách.Nhưng ngay cả khi đó là có thể bạn sẽ lãng phí chính xác cùng một số lượng băng thông như thể bạn đã sử dụng một liên kết trực tiếp để tải xuống tệp. Lý do đơn giản cho điều đó là trong cả hai trường hợp, bạn đang gọi cùng một điểm cuối trên máy chủ đang trả về cùng một tệp. Và đừng bị lừa khi nghĩ rằng nếu bạn không sử dụng AJAX, trang hiện tại sẽ * tải lại *. Không có yêu cầu bổ sung nào khác ngoài yêu cầu bổ sung cho hành động điều khiển sẽ truyền tệp. –

1

Thay vì làm một cuộc gọi ajax hơn trong trang của bạn, bạn có thể sử dụng thẻ neo và lực lượng php tải để thực hiện pdf tải

HTML 
    <a href="www.example.com/download_file.php?file_source=example.pdf">Download pdf here</a> 

PHP 
<?php 
$fullPath = $_GET['fileSource']; 
if($fullPath) { 
    $fsize = filesize($fullPath); 
    $path_parts = pathinfo($fullPath); 
    $ext = strtolower($path_parts["extension"]); 
    switch ($ext) { 
     case "pdf": 
     header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download 
     header("Content-type: application/pdf"); // add here more headers for diff. extensions 
     break; 
     default; 
     header("Content-type: application/octet-stream"); 
     header("Content-Disposition: filename=\"".$path_parts["basename"]."\""); 
    } 
    if($fsize) {//checking if file size exist 
     header("Content-length: $fsize"); 
    } 
    readfile($fullPath); 
    exit; 
} 
?> 

tôi đang kiểm tra cho kích thước tập tin bởi vì nếu bạn nạp pdf từ CDN CloudFront, bạn won `t có được kích thước của tài liệu mà lực lượng của tài liệu để tải về trong 0KB, Để tránh điều này tôi đang kiểm tra với tình trạng này

if($fsize) {//checking if file size exist 
     header("Content-length: $fsize"); 
    } 

Tôi cũng đã đấu tranh với vấn đề này, mã trên làm việc cho tôi Tôi hy vọng nó sẽ giúp

+2

Câu trả lời hay, mặc dù không thực sự có liên quan, với thẻ ASP.NET. – porjolovsky

+0

Cảm ơn @porjolovsky – Hitesh

0

Tôi có một câu trả lời rất chắc chắn. Bạn không thể tải xuống tệp PDF trong khi sử dụng yêu cầu ajax cho máy chủ. Vì vậy, thay vì đó bạn nên sử dụng html actionlink. ví dụ:

@Html.ActionLink("Convert Data into PDF", "PDFView", null, new { @class= "btn btn-info" }); 

Mã trên sẽ tạo nút liên kết và bạn có thể truy cập Phương thức hành động của bộ điều khiển. Ngoài ra, bạn có thể sử dụng bất kỳ kỹ thuật nào để trả lại tệp PDF từ bộ điều khiển ví dụ: bạn có thể trả lại tệp PDF bằng cách sử dụng lớp FileResult.

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