我正在使用强制下载来下载我所做的网站(http://pr1pad.kissyour.net)上的大部分 zip 和 mp3 - 以跟踪谷歌分析、数据库中的下载并隐藏真实的下载路径:
是这样的:
extending CI model
... - bunch of code
function _fullread ($sd, $len) {
$ret = '';
$read = 0;
while ($read < $len && ($buf = fread($sd, $len - $read))) {
$read += strlen($buf);
$ret .= $buf;
}
return $ret;
}
function download(){
/* DOWNLOAD ITSELF */
ini_set('memory_limit', '160M');
apache_setenv('no-gzip', '1');
ob_end_flush();
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public",FALSE);
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
if (isset($_SERVER['HTTP_USER_AGENT']) &&
(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false))
header('Content-Type: application/force-download'); //IE HEADER
header("Accept-Ranges: bytes");
header("Content-Disposition: attachment; filename=\"" . basename("dir-with- files/".$filename) . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize("dir-with-files/".$filename));
// Send file for download
if ($stream = fopen("dir-with-files/$filename", 'rb')){
while(!feof($stream) && connection_status() == 0){
//reset time limit for big files
set_time_limit(0);
print($this->_fullread($stream,1024*16));
flush();
}
fclose($stream);
}
}
它在带有 CI 1.7.2 的 LAMP 上 - 这是我自己的方法,来自互联网上的各种方法,因为在开发过程中,出现了这些问题: -服务器限制。ini_set
没有帮助,所以我使用缓冲_fullread
而不是正常fread
,它被用于@readonly
- ob_end_flush(),因为站点是在 CI1.7.2 中完成的,我需要清理缓冲区
现在......它不起作用。它确实如此,然后它停止显示预期的大小/下载时间 - 我试图清理它,当我清理代码时,发生了一些事情,我不知道在任何以前的版本中是什么 - 它没有工作(没有更改设置) -编辑:不工作=将所有内容输出到浏览器窗口。
所以我说,去他妈的,我会看这里。
所以,我基本上是在寻找脚本或函数,我可以把它放到我的输出模型中并且会做:
- 调用 force-download(在 Chrome 中开始下载,在 IE、FF、Safari 中打开 modal open/save/cancel)
- 显示文件大小和估计的 dl 时间(这取决于浏览器,我知道,但首先,浏览器必须知道文件大小
- 在 PC + Mac 上的 IE6、7、8、FF3、Opera、Chrome & 和 safari 中工作(测试并确认!)
- 在服务器上,我也有 56MB 内存限制,我无法添加,所以这也很重要
先感谢您。
编辑:现在我感觉比以前/以前更糟了,因为我试图用 .htaccess 强制下载 - 虽然它有效,但它几乎没有小/主要(选择你的)问题
- 它显示了完整的路径(对我来说是次要的)
- 它等到整个下载完成(显示为“正在连接”),然后只显示它正在下载 - 并在一秒钟内下载(对我来说很重要)
现在,虽然我删除了.htaccess,但它仍然等到下载完成(就像它首先下载到缓存一样),它只是获取connected
并显示打开/保存对话框。