php 파일 을 압축 하여 다운로드 하려 면 PHP 자체 의 ZipArchive 압축 파일 을 사용 하고 압축 된 파일 을 다운로드 합 니 다.

5177 단어 파일 패키지
요약:PHP 로 파일 을 다운로드 하 는 작업 은 네 개의 header()를 제시 해 야 합 니 다.제 다른 블 로 그 를 참고 하 십시오.PHP 는 다운로드 기능 의 초 상세 프로 세 스 분석 을 어떻게 실현 합 니까?파일 의 크기 를 계산 할 때 파일 을 먼저 열지 않 아 도 됩 니 다.filesize($filename)를 통 해 알 수 있 습 니 다.파일 을 먼저 열 어야 한다 면,filesize 는 이러한 형식 일 수 있 습 니 다.filesize($filehandle)가 클 라 이언 트 에 데 이 터 를 전송 하 는 것 은 buffer 를 설정 하여 클 라 이언 트 에 게 매번 얼마나 많은 데 이 터 를 출력 하 는 지 지정 하 는 것 입 니 다.예 를 들 어$buffer=1023.지정 하지 않 으 면 전체 파일 을 메모리 에 기록 하고 클 라 이언 트 에 게 feof()함 수 를 통 해 한번에 데 이 터 를 전송 합 니 다.읽 을 파일 이 다 읽 혔 는 지 판단 할 수 있 습 니 다.아직 읽 지 않 았 다 면 파일 을 계속 읽 습 니 다($filedata=fread()),클 라 이언 트 에 게 데 이 터 를 되 돌려 줍 니 다(echo$filedata)다운로드 가 완 료 될 때마다 클 라 이언 트 에서 새로 고침 을 합 니 다.이 는 사실 매번 에 데 이 터 를 임시 파일 에 기록 하고 모든 다운로드 가 완 료 된 후에 모든 데 이 터 를 다시 통합 시 킵 니 다.여기 서 제 가 사용 하 는 것 은 절대적 인 경로 입 니 다.절대적 인 경 로 는 좋 은 점 이 있 습 니 다.바로 적응성 이 비교적 강하 고 상대 적 인 경로 에 비해효율 이 높 습 니 다(파일 을 찾 는 과정 을 제외 하고)기술 요점 을 분석 하 십시오.파일 을 zip 형식 으로 포장 하여 파일 을 다운로드 하 는 기능 요점 분석:여기 서 제 가 사용 하 는 것 은 phop 자체 의 ZipArchive 류 a)입 니 다.저 희 는 new 하나의 ZipArchive 이미지 만 필요 합 니 다.그리고 open 방법 으로 zip 파일 을 만 들 고 addFile 방법 을 사용 하여 방금 만 든 zip 파일 에 압축 할 파일 을 기록 합 니 다.이 대상 을 닫 는 것 을 기억 하 는 것 이 좋 습 니 다.b)주의 점:open 방법 을 사용 할 때 두 번 째 인자$flags 는 선택 할 수 있 습 니 다.$flags 는 열 린 zip 파일 에 대한 처리 방식 을 지정 합 니 다.모두 네 가지 상황 이 있 습 니 다.i.ZIPARCHIVE::OVERWRITE 는 항상 새로운 파일 을 만 듭 니 다.지정 한 zip 파일 이 존재 하면 ii.ZIPARCHIVE::CREATE 가 지정 한 zip 파일 이 존재 하지 않 으 면 덮어 씁 니 다.iii.ZIPARCHIVE::EXCL 이 지정 한 zip 파일 이 존재 하면 오류 가 발생 합 니 다.메모:모든 작업 은 메모리 에 먼저 기록 해 야 합 니 다.비디오,오디 오,텍스트 파일 이 든 메모리 에 먼저 기록 해 야 합 니 다.다시 말 하면'서버'의 파일 을'서버'의 메모리 에 읽 을 때 이 동작 이 빠 질 수 없습니다.br>파일 을 메모리 에 기록 하려 면 파일 을 먼저 열 어야 하기 때문에 세 개의 파일 작업 함수 가 필요 합 니 다.하 나 는 fopen($filename,$mode)2:fread(int$handle,int$length)3:fclose(resource$handle)클 라 이언 트 엔 드 의 작업 입 니 다.그러면 서버 엔 드 메모리 에 존재 하 는 파일 정보 흐름 을 어떻게 합 니까?클 라 이언 트 에 게 전 할 까요?정 답 은 header()함 수 를 통 해 클 라 이언 트 가 파일 을 어떻게 처리 해 야 하 는 지,저장 해 야 하 는 지,열 어야 하 는 지 등 최종 효 과 를 알 수 있 습 니 다.다음 그림 과 같 습 니 다.
 
<?php
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 )
*/
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>";
}
}
}
?>

좋은 웹페이지 즐겨찾기