2011-09-28 181 views
9

我的問題是類似Download and open pdf file using AjaxJQuery的Ajax調用的PDF文件下載

但不完全一樣,我希望有一個JQuery的AJAX的原因是被動態地從將從中獲取的數據生成我的文件同一頁。

所以基本上我有一個Json對象需要發送到服務器,它會動態生成一個文件並將其發送回瀏覽器。

我不想在我的Json對象stringyfied, 上使用查詢字符串,因爲我認爲查詢字符串會有字符限制(我在這裏?

請讓我知道如果我的工作流程是正確的,或者我可以使用不同的流程來實現同樣的事情。

回答

8

你不應該使用AJAX來下載文件。這不起作用。這是說,你只剩下2種選擇:

  1. 動作鏈接和查詢字符串參數或是下載必須在某些特定的JavaScript事件trigerred你也可以設置window.location.href到是應該產生的作用PDF文件並將查詢字符串參數傳遞給它。

  2. ,或者如果你是怕你有大量的數據傳遞給控制器​​的行動,將產生PDF下載你所使用<form>method="POST"和內部使用的隱藏字段存儲儘可能多的參數和數據,你像:

    @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:您如何看待使用AJAX GET請求在服務器上生成文件?這使我能夠捕獲失敗回調中的文件生成過程中發生在服務器上的任何錯誤,並將其顯示給用戶。如果成功,我然後在ajax成功回調中傳遞文件名並執行'window.location = server \ folder \ filename'。我正在使用ASP.NET Web API。 –

+0

OP專門詢問ajax。這是對帶寬的浪費。 – CodeWarrior

+0

@OmarPadilla,您無法使用AJAX將文件下載到客戶端。但即使這是可能的,如果您使用直接鏈接下載文件,也會浪費完全相同的帶寬量。原因很簡單,就是在這兩種情況下,您都是在返回相同文件的服務器上調用相同的端點。不要被愚蠢地認爲,如果你不使用AJAX,當前頁面將*重載*。沒有其他請求,而不是控制器操作的其他請求將流式傳輸文件。 –

1

而是在你的頁面,您可以使用錨標記和php力下載進行下載PDF製作一個更Ajax調用的

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; 
} 
?> 

我檢查了文件的大小,因爲如果從CDN CloudFront的加載PDF,你那倒得到的文件大小,這迫使該文件中0KB下載,爲了避免這種情況我與這個條件

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

我也在努力解決這個問題,上面的代碼爲我工作,我希望它可以幫助

+2

好的答案,儘管沒有真正相關的,給ASP.NET標籤。 – porjolovsky

+0

謝謝@porjolovsky – Hitesh

0

我有一個非常確定的答案。使用ajax請求到服務器時,不能下載PDF文件。所以,而不是你應該使用HTML動作鏈接。例如

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

上面的代碼會生成一個鏈接按鈕,你可以訪問控制器的操作方法。您也可以使用任何技術從控制器返回PDF文件,例如您可以使用FileResult類返回PDF文件。