0

我收到一些用户报告他们无法下载文件。

这是下载计数器文件中的脚本。

<?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 上效果不佳。是对的吗 ?

这样做的正确方法是什么?

4

3 回答 3

0

header(Location: ...) IE6 肯定有一些问题,甚至可能是更高版本。

尝试对生成的字符串(链接)进行 url 解码,看起来 IE 在 header(Location: ...) 中的链接字符串被 url 编码时存在一些问题。

也一定要在 heder 之后退出...

出口;

于 2012-09-27T14:45:10.263 回答
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;
于 2012-09-27T14:45:28.703 回答
0

在研究和尝试了大量的测试和试验之后,我发现了一些关于header()功能和readfile()或类似的事实。

  1. 首先你应该知道它header()与不同浏览器的兼容性问题。所以不要试图寻找完美无缺的功能。问题不在于 php 函数,而是浏览器具有不同的分析下载标头的方式,因此它们的行为都不同。你可能已经知道了,最大的麻烦是IE

  2. 如果您想解决问题并使其工作header(),您必须添加/强制一些标题详细信息(Content-Type等),但这在您的 php 代码中是不可能的。无论您尝试多少次,它都不起作用。我对此没有太多信息,但我只知道即使您Content-Type在实际添加标题之前header()它也不起作用。似乎它们完全出于不同的目的。

  3. 您可以使用添加必要的标题并改用该readfile()功能,它会正常工作。但是你应该知道这个函数会将你调用的文件/url加载/读取到内存中。这可能是一个大问题,并且可能会减慢您的网络服务器,最糟糕的情况是它也可能崩溃。如果您的下载程序过多或文件过多,则可能会发生这种情况。

不幸的是,正如我之前提到的,您无法在 php 代码中解决此问题。所以我为了解决这个问题所做的就是在我的网络服务器虚拟主机中添加标​​题。

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 格式。但是您可以更改它或设置一个全局指令,以便它可以使用任何格式。

于 2012-11-10T10:38:23.403 回答