2012-08-06 285 views
2

我試圖使用PHP來強制客戶端計算機上下載(文件對話框 - 沒有什麼險惡)。我發現很多頁面推薦使用header()函數來控制我的PHP腳本的響應,但是我對此沒有任何好運。我的代碼如下:PHP強制文件下載

$file = $_POST['fname']; 

if(!($baseDir . '\\AgcommandPortal\\agcommand\\php\\utils\\ISOxml\\' . $file)) { 
    die('File not found.'); 
} else { 
    header('Pragma: public'); 
    header('Content-disposition: attachment; filename="tasks.zip"'); 
    header('Content-type: application/force-download'); 
    header('Content-Length: ' . filesize($file)); 
    header('Content-Description: File Transfer'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Connection: close'); 
    ob_end_clean(); 
    readfile($baseDir . '\\AgcommandPortal\\agcommand\\php\\utils\\ISOxml\\' . $file); 
} 

我使用這個JavaScript調用它:

 $.ajax({ 
      url: url, 
      success: function(text) { 
       var req = new XMLHttpRequest(); 
       req.open("POST", 'php/utils/getXMLfile.php', true); 
       req.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
       req.send('fname=' + encodeURIComponent(text)); 
      } 
     }); 

這將返回文件作爲文本的內容,但不會觸發下載對話框。有沒有人有什麼建議?而不是使用AJAX的

+0

我不認爲它是重複的。這裏的問題稍有不同。問題是post操作的結果不會觸發由php生成的答案的頭部中指定的下載行爲。 – ALoopingIcon 2017-02-11 16:37:21

回答

6

,只是將瀏覽器重定向到相關網址。當它收到content-disposition:attachment標題時,它將下載該文件。

+0

如果我重定向瀏覽器,它不會清除已加載的頁面嗎?這有些問題,因爲這只是一個更大的頁面的一小部分。 – Crash 2012-08-06 21:52:38

+0

+1非常真實,如果您不需要調用的結果,爲什麼要使用AJAX? – 2012-08-06 21:52:45

+0

@Crash它不會重定向,只是「保存文件」對話框將彈出... – 2012-08-06 21:54:34

1

幾點建議:

1.

if(!($baseDir . '\\AgcommandPortal\\agcommand\\php\\utils\\ISOxml\\' . $file)) { 

相反:

if(!file_exists($baseDir ....)){ 

2.不要需要的尺寸。

3.Try這一個:

header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($fullpath)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    ob_clean(); 
    flush(); 
    readfile($fullpath); 
    exit; 
+0

每當我包含flush(),我都沒有任何輸出。 – Crash 2012-08-06 22:04:44

+0

和每當不包括它? – 2012-08-06 22:06:48

+0

我在響應中得到文件的文本內容,但沒有下載窗口 – Crash 2012-08-06 22:08:35

0

我會嘗試從PHP發送一個頭這樣的,以取代您application/force-download頭:

header("Content-type: application/octet-stream"); 
+0

我試過那個 – Crash 2012-08-06 22:05:36

0

Kolink的回答爲我工作(改變窗口位置的PHP文件),但因爲我想發送POST變量與請求一起,我最終使用了一個隱藏的窗體。我使用的代碼如下:

   var url = 'php/utils/getXMLfile.php'; 
       var form = $('<form action="' + url + '" method="post" style="display: none;">' + 
        '<input type="text" name="fname" value="' + text + '" />' + 
        '</form>'); 
       $('body').append(form); 
       $(form).submit(); 

感謝您的所有答案!