2012-09-27 46 views
0

我收到一些用戶的報告,他們無法下載文件。PHP:使用標題()函數下載失敗

這是下載計數器文件中的腳本。

<?php 
$id = $_GET['id']; 
require('conn.php'); 
$stmt = write_conn()->prepare("UPDATE links SET dl_count = dl_count + 1 WHERE ID=" . $id); 
$stmt->execute(); 
header('Location: ' . $row['mp3_url']); 
?> 

聽說使用Header()功能重定向用戶下載鏈接有一定的侷限性,它不能在IE瀏覽器很好地工作。是對的嗎 ?

什麼是做到這一點的正確方法?

+0

只有失敗了會前的數據已經輸出等標題是爲時已晚的原因。 – BugFinder

+2

確保你在'header'之後有'exit'。 –

+0

@AleksG我用完整的代碼更新了帖子。你可以看到'header'沒有回顯或打印。 – xperator

回答

0

研究和嘗試了很多的測試&試驗後,我發現關於header()功能和readfile()或相似的人的一些事實。

  1. 首先您應該知道header()與不同瀏覽器存在兼容性問題。所以不要試圖尋找完美無瑕的功能。這個問題不是PHP功能,它是瀏覽器有不同的方式分析下載頭,所以他們都表現不同。你可能已經知道,最大的麻煩製造者是IE

  2. 如果要解決這個問題,並使其工作使用header(),你必須添加/迫使一些標題詳細信息(Content-Type,等等),但是,這是不可能在你的php代碼中。無論你嘗試了多少次,它都不起作用。我對此沒有太多的信息,但是我只知道即使在實際的header()之前添加Content-Type標題,它也不起作用。看起來他們完全是出於不同的目的。

  3. 您可以使用添加必要的報頭,並使用readfile()函數,然後它會正常工作。但是你應該知道這個函數會加載/讀取你調用的內存中的文件/ url。這可能是一個很大的問題,可能會讓你的網絡服務器變慢,最糟糕的情況是它也可能崩潰。如果您的下載器或許多文件太多,就會發生這種情況。

不幸的是,正如我前面提到的,你不能在你的php代碼中修復這個問題。所以我爲了解決這個問題所做的是在我的webserver vhost中添加了頭文件。

NGINX:

location ~ ^/.*\.mp3$ { 
     add_header Pragma "public"; 
     add_header Expires "0"; 
     add_header Cache-Control "must-revalidate, post-check=0, pre-check=0"; 
     add_header Content-Disposition "attachment"; 
     add_header Content-Type "application/force-download"; 
     add_header Content-Type "application/octet-stream"; 
     add_header Content-Type "application/download"; 
     add_header Content-Transfer-Encoding "binary"; 
     } 

在我的情況下,該文件的用戶必須下載爲MP3格式。但是你可以改變它或者設置一個全局指令,這樣它就可以使用任何格式。

0

頭(地點:...)有一些問題IE6是肯定的,甚至可能更高版本。

嘗試URL解碼生成的字符串(鏈接),它看起來像IE瀏覽器有一些問題鏈接字符串頭(地點:...)是URL編碼。

也一定要在出口後做出口...

exit;

+0

如果這個'header'函數有任何兼容性問題,有沒有其他方法可以做到這一點? – xperator

+0

我有這個URL編碼刺激的問題。而且,當你寫位置而不是位置可能會導致一些問題...其他然後我沒有經歷過。 – Develoger

0
header('Content-Disposition: attachment; filename="'.$fileName.'"'); 
header('Content-Type: application/force-download'); 
header('Content-Type: application/octet-stream'); 
ob_flush(); 
readfile($row['mp3_url']); 
exit; 
+0

我在某處嘗試強制下載文件時,某些瀏覽器將顯示文件數據而不是顯示下載對話框。 – xperator