2012-09-27 59 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