ホームページ  >  記事  >  バックエンド開発  >  ファイルのパッケージ化、ダウンロード、および PHP 独自の ZipArchive を使用してファイルを圧縮し、パッケージ化されたファイルをダウンロードする

ファイルのパッケージ化、ダウンロード、および PHP 独自の ZipArchive を使用してファイルを圧縮し、パッケージ化されたファイルをダウンロードする

WBOY
WBOYオリジナル
2016-06-20 12:47:09879ブラウズ

概要:

  1. PHP を使用してファイルをダウンロードする操作には 4 つの header() が必要です。私の他のブログ投稿を参照してください。 : PHP がダウンロード関数を実装する方法の詳細なプロセス分析
  2. ファイルのサイズを計算するとき、最初にファイルを開く必要はありません。 filesize($filename. ) 最初にファイルを開く必要がある場合、ファイルサイズは filesize($filehandle)
  3. の形式になる可能性があります。データをクライアントに送り返すには、指定する buffer を忘れずに設定してください。 each クライアントにデータが出力される回数 ($buffer=1023 など)。指定しない場合、ファイル全体をメモリに書き込み、クライアントにデータを一括送信します。
  4. feof()関数により、読み込むファイルが既に読み込まれているかどうかを判定できます。まだ読み取りが完了していない場合は、ファイルの読み取りを続けて ($file_data=fread())、データをクライアントに送り返します (echo $file_data)
  5. 各ダウンロードが完了したら、クライアントは更新します。実際には、すべてのダウンロードが完了すると、データは毎回一時ファイルに書き込まれます。
  6. ここでは、利点がある絶対パスを使用します。つまり、相対パスよりも適応性が高く、効率的です (ファイルを見つけるプロセスが不要になります)
技術的なポイントの分析:

  1. ファイルを zip 形式に圧縮します
  2. ファイルをダウンロードする関数

キーポイント分析:

  1. ここで使用するものこれは php に付属する ZipArchive クラスです。

a) 新しい ZipArchive オブジェクトを作成し、open メソッドを使用して zip ファイルを作成し、addFile メソッドを使用してファイルを書き込むだけです。作成したばかりのファイルを zip ファイルにパッケージ化するには、忘れずにオブジェクトを閉じることをお勧めします。

b)オープンメソッドを使用する場合、2番目のパラメーター$フラグは、開くZIPファイルの処理方法を指定します。ファイルが存在しない場合は、新しいファイルを作成します

iii. ZIPARCHIVE::EXCL 指定された zip ファイルが存在する場合、エラーが報告されます

iv. ZIPARCHIVE::CHECKCONS

ファイルのダウンロード処理:

サーバー側の作業:

------------------ ---------------- ------------

クライアントのブラウザは、ダウンロードされた php ファイルを処理するリクエストを送信します。

注: ビデオ、オーディオ、テキスト ファイルのいずれの操作も、最初にメモリに書き込む必要があります。

つまり、「サーバー」上のファイルを「サーバー」のメモリに読み込む操作が必須です (注: ここでは主にこれを説明するために、サーバーという単語を二重引用符で囲みます) 一連の操作が完了しますサーバー上にあります)。 0c6dc11e160d3b678d68754cc175188a
ファイルをメモリに書き込みたいので、最初にファイルを開く必要があります
したがって、ここでは 3 つのファイル操作関数が必要です:
1: fopen($filename,$ mode)
2 つ: fread ( int $handle , int $length )
3 つ: fclose ( resource $handle )

---------------- --- --------------------
クライアント側の作業:
---------------- ---- -------------------

では、サーバー側のメモリに既に存在するファイル情報ストリームをクライアントに渡すにはどうすればよいでしょうか?

答えは、header() 関数を通じて、クライアントはファイルを保存するか開くかなどの処理方法を知ることです。



最終的な効果は次のとおりです。以下:

<?phprequire'./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格式)         */        public function tozip($items){             $zip=new ZipArchive();            $zipname=date('YmdHis',time());            if (!file_exists($zipname)){                $zip->open($zipname.'.zip',ZipArchive::OVERWRITE);//创建一个空的zip文件                for ($i=0;$i<count($items);$i++){                    $zip->addFile($this->currentdir.'/'.$items[$i],$items[$i]);                }                $zip->close();                $dw=new download($zipname.'.zip'); //下载文件                $dw->getfiles();                unlink($zipname.'.zip'); //下载完成后要进行删除                }        }    }?>



<?php/** * 下载文件 * */    class download{        protected $_filename;        protected $_filepath;        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);//去小数点后两位        }        //下载文件的功能        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);            }else {                echo "<script>alert('对不起,您要下载的文件不存在');</script>";            }        }    }?>


ページコード:


<script type="text/javascript" src="jquery-1.7.2.js"></script><script type="text/javascript" src="ajax.js"></script><?php    header("Content-type:text/html;charset=utf8");    require('./getfile.php');    $scandir=new traverseDir();    $scandir->scandir($scandir->currentdir);    $scandir->currentdir;        if (isset($_POST['down_load'])){         $items=$_POST['items'];        $scandir->tozip($items);//将文件压缩成zip格式    }     echo "当前的工作目录:".$scandir->currentdir;    echo "<br>当前目录下的所有文件";?><form action="list.php" method="POST"><table>    <tr>        <td></td>        <td>名称</td>        <td>大小(KB)</td>    </tr><?php    $res=$scandir->fileinfo;    foreach ($res as $k=>$v){        if (!($k=='.' || $k=='..'))    {//过滤掉.和..?>    <tr>        <td><input type="checkbox" name="items[]" class="filename" value="<?php echo $k;?>"></td>        <td><?php echo $k; ?></td>        <td><?php echo number_format($v[0],0); ?></td>    </tr><?php        }    }?>    <tr>        <td><input type="checkbox" id="selall"><label for="selall">全选</label></td>        <td><input type="submit" name="down_load" value="打包并下载" id="tozip_tetttt"></td>    </tr></table></form>



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。