我随机地从页面上的一个链接得到下载错误。我还简化了目录的链接,便于用户在电子邮件中使用。
在主页上,该链接如下所示:
a href="http://myPage.com/Mac" target="_blank" id="macDownloadButton" class="downloadbutton w-button">Download Mac version</a>在我的服务器上,这是一个包含index.php的目录,如下所示:
<?php
// mac version
$file="http://www.myPage.com/downloads/myApp_Mac.zip";
$filename="myApp_Mac.zip";
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
header('Content-Length: ' . filesize($file));
header('Content-Encoding: none');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename=' . $filename);
readfile($file);
exit;
?>同样,我这样做的原因是,它是一个简单的链接,可以通过电子邮件发送给用户,比如"http://myPage.com/Mac“和"http://myPage.com/Windows”。
奇怪的是,它主要是works...but,有时它不是。
我做错了什么?
发布于 2018-01-02 01:22:02
除非你使用check for errors on your readfile() call,否则很难知道到底出了什么问题。
但是,当您指定以http开头的文件名时,您将从此处的web服务器调用web服务器。你在做什么
readfile('http://www.myPage.com/downloads/myApp_Mac.zip');在那里你可以很容易的做到
readfile('../downloads/myApp_Mac.zip');并从本地文件系统中读取zip文件以发送给您的用户。
更重要的是,filesize('../downloads/myApp_Mac.zip');将快速生成一个数值并在Content-Length报头中发送它。这将允许浏览器,通过知道你发送的文件的总大小,显示一个有意义的进度条。
你应该去掉Accept-Ranges头文件;你给我们看的php程序不支持range requests。如果你欺骗浏览器,告诉它你确实接受了这些请求,浏览器可能会感到困惑,并破坏下载的文件副本。这会让你的用户感到困惑。
您的Content-Disposition标头非常完美。它在downloads文件夹中定义要在用户计算机上使用的文件名。
简单的操作更可靠,这可能会对你有所帮助。
您得到stat failed with link作为错误消息的原因是:stat(2) is a operating-system call操作本地和挂载的文件系统中的文件。
发布于 2018-01-02 01:49:55
正如O. Jones之前提到的,您绝对应该始终使用本地文件路径。
我之前的大多数问题都是与浏览器相关的,我需要调整/添加http头文件,有一次我需要用小写发送所有的HTTP头文件,但我已经多年没有遇到过这样的问题了。我个人的建议是使用可靠的下载库/函数--它将显著提高您的工作效率,并排除您可能遇到的大多数与浏览器相关的问题。
在过去的3年里,我一直在使用codeIgniter download helper,并推荐99%的用例使用它。至少,我建议你通读它的代码--你可能会发现一些你从未考虑过的情况,比如清除输出缓冲区,mime检测,甚至是Android 2.1的特殊情况,以及一些你可能需要或可能不需要的头文件。
如果其他方法都失败了,我不知道你在哪台服务器上运行,但如果你仍然有问题,我建议你监控你的机器正在运行的进程,同时密切关注ram和IO的使用情况。我遇到过一些糟糕的/行为不端的服务,它们在短时间间隔内使用99%的IO或ram定期运行,这导致了一些非常奇怪和意想不到的错误。
https://stackoverflow.com/questions/48051643
复制相似问题