私は強制ダウンロードを使用して、私が行ったサイト(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);
}
}
それはCI1.7.2のLAMP上にあります-開発中にこれらの問題が発生したため、これはインターネット全体のさまざまなハウツーからまとめられた私自身の方法です:-サーバー制限。
サイトがCI1.7.2で行われ、バッファをクリーンアップする必要があったため、-ob_end_flush()の代わりに通常のini_set
バッファを使用しました。_fullread
fread
@readonly
今...それは動作しません。すると、予想されるサイズ/ダウンロード時間が表示されなくなりました-クリーンアップしようとしましたが、コードをクリーンアップしているときに、何かが発生しました。以前のバージョンでは、機能しませんでした(設定の変更)-編集:機能しない=すべてをブラウザウィンドウに出力します。
だから私は言った、それをねじ込み、私はここを見ていきます。
したがって、私は基本的にスクリプトまたは関数を探します。これを出力モデルに配置して、次のことを実行します。
- 強制ダウンロードを呼び出す(Chromeではダウンロードを開始し、IE、FFではSafariでモーダルオープン/保存/キャンセルを開きます)
- ファイルのサイズと推定dl時間を表示します(これはブラウザ次第ですが、最初に、ブラウザはファイルサイズを知っている必要があります
- IE6、7、8、FF3、Opera、Chrome、およびPC + Mac(Linux ...私は本当に気にしない)のサファリでの作業(テストおよび確認済み!)-これはヘッダー部分です
- サーバー上では、56MBのメモリ制限のようなものもありますが、これを追加することはできません。これも重要です。
前もって感謝します。
編集:.htaccessでダウンロードを強制しようとしたので、今まで以上に厄介な気分になりました-それが機能している間、マイナー/メジャー(あなたを選んでください)の問題はほとんどありませんでした
- それはフルパスを示しました(私にとってはマイナー)
- ダウンロード全体が完了するまで待機し(「接続中」と表示)、ダウンロード中であることを表示します。1秒でダウンロードします(私にとってはメジャー)
ここで、.htaccessを削除しましたが、ダウンロードが完了するまで待機し(最初にキャッシュにダウンロードした場合と同じように)、取得してconnected
[開く/保存]ダイアログを表示します。