概要:
PHP を使用してファイルをダウンロードする操作には 4 つの header() が必要です。私の他のブログ投稿「PHP によるダウンロード関数の実装方法」を参照してください。ファイルのサイズを計算するときは、次のようにします。最初にファイルを開く必要はありません。filesize($filename) で確認できます。最初にファイルを開く必要がある場合、filesize は filesize($filehandle) の形式になる可能性があります
データをクライアントに送り返すには、次のことを覚えておいてください。バッファを設定するには、「$buffer=1023」のように、毎回クライアントに出力するデータ量を指定します。指定しない場合、ファイル全体がメモリに書き込まれ、読み取られるファイルが読み込まれているかどうかを feof() 関数によって一度にクライアントに送信します。読み取られていない場合は、ファイルの読み取りを続行し ($file_data=fread())、データをクライアントに送り返します (echo $file_data)
各ダウンロードが完了すると、クライアントが更新され、実際にはデータは毎回一時ファイルに書き込まれ、すべてのダウンロードが完了したら、すべてのデータを再統合します
ここでは絶対パスを使用します。絶対パスには、相対パスよりも適応性が高く、効率的であるという利点があります (プロセスが不要になります)。
技術的なポイントの分析:,新しい ZipArchive オブジェクトを作成し、次に open メソッドを使用して zip ファイルを作成し、次に addFile メソッドを使用して、作成したばかりの zip ファイルにパッケージ化するファイルを書き込みます。忘れずにオブジェクトを閉じることをお勧めします。
b) 注: open メソッドを使用する場合、2 番目のパラメーター $flags は、開かれた zip ファイルの処理方法を指定するために使用されます。
i. ZIPARCHIVE::OVERWRITE を常に作成します。指定した zip ファイルが存在する場合は上書きされます
ii. ZIPARCHIVE::CREATE 指定された zip ファイルが存在しない場合は、新しいファイルを作成しますiii. 指定された zip ファイルが存在する場合ファイルが存在する場合、エラーが報告されます。
iv. ZIPARCHIVE::CHECKCONS
ファイルのダウンロードのプロセス:イアロイ
注: ビデオ、オーディオ、テキスト ファイルのいずれであっても、操作は最初にメモリに書き込まれる必要があります。
言い換えれば、「サーバー」上のファイルを「サーバー」のメモリに読み取る操作が不可欠です (注: ここでは、主にこのシステムを説明するために、サーバーという単語を二重引用符で囲んでいます。クラスの操作は上で完了します)サーバー)。
ファイルをメモリに書き込みたいので、最初にファイルを開く必要があります
ここでは 3 つのファイル操作関数を示します:
1 つ: fopen($filename,$mode)
2 つ: fread (int $handle, int $length)
3 つ: fclose (resource $handle)
クライアントの作業:
それでは、サーバーのメモリに既に存在するファイル情報フローをクライアントに渡すにはどうすればよいでしょうか?
答えは header() 関数を介して行われ、クライアントはファイルの処理方法、保存するか開くかなどを知っています。
最終的な効果は以下のようになります:
コードをコピーします
コードは次のとおりです:
require'./download.php';
/**
* ディレクトリを走査し、zip 形式にパッケージ化します
*/
class traverseDir{
public $currentdir;//現在のディレクトリ
public $filename;//ファイル名
public $ fileinfo;//現在のディレクトリにすべてのファイル名、ディレクトリ名、ファイルサイズを保存するために使用されます
public function __construct(){
$this->currentdir=getcwd();//現在のディレクトリに戻ります
}
/ /ディレクトリを走査
public function scandir($filepath){
if (is_dir($filepath)){
$arr=scandir($filepath){
foreach ($arr as $k=>$v){
$ this->fileinfo[$v][]=$this->getfilesize($v);
}
}else {
echo "<script>alert('現在のディレクトリは有効なディレクトリではありません'); </script>";
}
}
/**
* ファイルのサイズを返す
*
* @param string $filename ファイル名
* @return ファイルサイズ (KB)
*/
public function getfilesize($fname){
return filesize($fname)/1024;
}
/**
* 圧縮ファイル(zip形式)
*/
パブリック関数 tozip($items){
$zip=new ZipArchive();
$zipname=date('YmdHis',time());
if (!file_exists($zipname)){
$zip-> open($zipname.'.zip',ZipArchive::OVERWRITE);//空の zip ファイルを作成します
for ($i=0;$i$zip-> addFile($this-> ;currentdir.'/'.$items[$i],$items[$i]);
}
$zip->close();
$dw=new download($zipname. '.zip'); //ファイルをダウンロードします
$dw->getfiles(); //ダウンロードが完了したら削除します
}
}
;
コードをコピーします
コードは次のとおりです: /**
* ファイルをダウンロード
*
*/
class download{
protected $_filename;
protected $_filesize; ;//ファイルサイズ
public function __construct ($filename){
$this->_filename=$filename;
$this->_filepath=dirname(__FILE__).'/'.$filename;
//ファイル名を取得します
public function getfilename() {
return $this->_filename
}
//ファイルパスを取得します(ファイル名を含む)
public function getfilepath(){
return $this->_filepath; ;
}
//ファイルサイズを取得します
public function getfilesize(){
return $this->filesize=number_format(filesize($this->filepath)/(1024*1024),2);//小数点以下第 2 位まで削除
}
//ファイルをダウンロード Function
public function getfiles(){
//ファイルが存在するか確認
if (file_exists($this->_filepath)){
//ファイルを開く
$ file = fopen($this->_filepath,"r ");
//返されるファイルタイプ
Header("Content-type: application/octet-stream")
//バイトサイズに基づいて返されます
Header ("Accept-Ranges: bytes");
//ファイルのサイズを返します
Header("Accept-Length: ".filesize($this->_filepath));
//これはポップアップ ダイアログですクライアントのボックス、対応するファイル名
Header("Content-Disposition:attachment; filename =".$this->_filename);
//変更前に一度クライアントにデータを送信します
echo fread($file, filesize($this->_filepath));
//変更後、1024 バイトのデータのみをクライアントに送信します
//データをクライアントに送り返します
$buffer=1024;//
//ファイルは完全に読み取られました
while (!feof($file)) {
//ファイルをメモリに読み取ります
$file_data=fread($file,$buffer);
//1024 バイトのデータをクライアントに送信します毎回
echo $file_data;
fclose($file);
echo "<script>alert('ダウンロードしたいファイルは存在しません');</script> ";
}
}
}
?>
ページに表示されるコード:
コードをコピー
コードは次のとおりです:
header("Content-type:text/html;charset=utf8");
$scandir=new traverseDir(); $scandir->scandir($scandir->現在のディレクトリ);
if (isset($_POST['down_load'])){
$items=$_POST['items'] ;
$scandir->tozip($items);//ファイルをzip形式に圧縮します
}
echo "現在の作業ディレクトリ:".$scandir->currentdir;
echo "
すべてのファイル";
?>