gpt4 book ai didi

php - 白痴证明,跨浏览器强制下载 PHP

转载 作者:可可西里 更新时间:2023-11-01 13:17:03 34 4
gpt4 key购买 nike

我在网站上使用强制下载来下载大部分 zip 和 mp3 ( http://pr1pad.kissyour.net ) - 跟踪谷歌分析、数据库中的下载并隐藏真实的下载路径:

是这样的:

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 中完成的,我需要清理缓冲区

现在...它不起作用。确实如此,然后它停止显示预期的大小/下载时间 - 我试图清理它,当我清理代码时,发生了一些事情,我不知道是什么,在任何以前的版本中 -它不起作用(设置没有任何变化)- 编辑:不起作用 = 将所有内容输出到浏览器窗口。

所以我说,去他的,我来看看。

所以,我主要是寻找脚本或函数,我可以将它们放入我的输出模型并执行以下操作:

  • 调用强制下载(在 Chrome 启动下载,在IE,FF,Safari打开模态打开/保存/取消)
  • 显示文件大小和估计的 dl 时间(这取决于浏览器,我知道,但首先,浏览器必须知道文件大小
  • 在 PC + Mac 上的 IE6、7、8、FF3、Opera、Chrome 和 safari 中工作(经过测试和确认!)(Linux ......我真的不在乎)- 这是标题部分
  • 在服务器上,我也有类似 56MB 的内存限制,我无法添加,所以这也很重要

提前谢谢你。

编辑:现在我觉得比以往任何时候都更糟,因为我试图用 .htaccess 强制下载 - 虽然它有效,但它几乎没有小/大(选择你的)问题

  • 它显示了完整的路径(对我来说是次要的)
  • 它会等到整个下载完成(显示为“正在连接”),然后才显示它正在下载 - 并在一秒钟内下载(对我来说很重要)

现在,虽然我删除了 .htaccess,它仍然会等到下载完成(就像它首先下载到缓存一样)并且它只是连接并显示打开/保存对话框。

最佳答案

所以,我使用了这段代码(它是在互联网上找到的可恢复 http 下载的修改版本)

function _output_file($file, $path)
{
$size = filesize($path.$file);

@ob_end_clean(); //turn off output buffering to decrease cpu usage

// required for IE, otherwise Content-Disposition may be ignored
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');

header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header("Content-Transfer-Encoding: binary");
header('Accept-Ranges: bytes');

/* The three lines below basically make the
download non-cacheable */
header("Cache-control: no-cache, pre-check=0, post-check=0");
header("Cache-control: private");
header('Pragma: private');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// multipart-download and download resuming support
if(isset($_SERVER['HTTP_RANGE']))
{
list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2);
list($range) = explode(",",$range,2);
list($range, $range_end) = explode("-", $range);
$range=intval($range);
if(!$range_end) {
$range_end=$size-1;
} else {
$range_end=intval($range_end);
}

$new_length = $range_end-$range+1;
header("HTTP/1.1 206 Partial Content");
header("Content-Length: $new_length");
header("Content-Range: bytes $range-$range_end/$size");
} else {
$new_length=$size;
header("Content-Length: ".$size);
}

/* output the file itself */
$chunksize = 1*(1024*1024); //you may want to change this
$bytes_send = 0;
if ($file = fopen($path.$file, 'rb'))
{
if(isset($_SERVER['HTTP_RANGE']))
fseek($file, $range);

while
(!feof($file) &&
(!connection_aborted()) &&
($bytes_send<$new_length) )
{
$buffer = fread($file, $chunksize);
print($buffer); //echo($buffer); // is also possible
flush();
$bytes_send += strlen($buffer);
}
fclose($file);
} else die('Error - can not open file.');

die();
}

然后在模型中:

function download_file($filename){
/*
DOWNLOAD
*/
$path = "datadirwithmyfiles/"; //directory

//track analytics

include('includes/Galvanize.php'); //great plugin
$GA = new Galvanize('UA-XXXXXXX-7');
$GA->trackPageView();

$this->_output_file($filename, $path);

}

它在所有提到的 Win/MAC 浏览器中都按预期工作 - 到目前为止,没有问题。

关于php - 白痴证明,跨浏览器强制下载 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2222955/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com