PHP에서 압축 파일을 처리 할 때 Zip_Read () 함수를 사용하면 압축 패키지의 내용을 하나씩 읽을 수 있습니다. 재귀 폴더 작업을위한 scandir () 함수를 사용하면 서버 측에서 zip 파일을 자동으로 압축하고 디렉토리 구조를 유지하는 함수를 쉽게 구현할 수 있습니다. 이 기사는이 두 기능을 통해 이러한 스크립트를 작성하는 방법을 자세히 소개합니다.
PHP 환경에 지퍼 확장이 활성화되어 있는지 확인하십시오. 활성화되지 않은 경우 php.ini 파일을 편집하고 다음 구성 줄 및 무책임을 찾을 수 있습니다.
extension=zip
그런 다음 웹 서버를 다시 시작하십시오.
zip 파일을 엽니 다.
지퍼의 각 항목을 반복하십시오.
항목이 디렉토리인지 파일인지 확인하십시오.
scandir ()를 사용하여 사용자 정의 함수로 디렉토리 구조를 재귀 적으로 만듭니다.
대상 경로에 ZIP로 파일을 작성하십시오.
<?php
function createDirRecursive($path) {
if (!is_dir($path)) {
mkdir($path, 0777, true);
}
}
function unzipWithStructure($zipFilePath, $destination) {
$zip = zip_open($zipFilePath);
if (is_resource($zip)) {
while ($zip_entry = zip_read($zip)) {
$entryName = zip_entry_name($zip_entry);
$fullPath = $destination . '/' . $entryName;
// 디렉토리 인 경우,만들다
if (substr($entryName, -1) === '/') {
createDirRecursive($fullPath);
} else {
// 파일이 존재하는 디렉토리를 확인하십시오
$dirPath = dirname($fullPath);
createDirRecursive($dirPath);
if (zip_entry_open($zip, $zip_entry)) {
$fileContent = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
file_put_contents($fullPath, $fileContent);
zip_entry_close($zip_entry);
}
}
}
zip_close($zip);
} else {
echo "열 수 없습니다ZIP문서: $zipFilePath";
}
}
// 사용의 예
$zipPath = '/var/www/html/uploads/sample.zip';
$extractTo = '/var/www/html/extracted';
// 기능을 호출하여 압축 압력을가하십시오
unzipWithStructure($zipPath, $extractTo);
?>
scandir ()를 사용하여 대상 디렉토리 구조가 올바르게 생성되었는지 추가로 확인하십시오. 예를 들어:
function listAllFiles($dir) {
$files = scandir($dir);
foreach ($files as $file) {
if ($file === '.' || $file === '..') continue;
$path = $dir . '/' . $file;
if (is_dir($path)) {
echo "목차: $path\n";
listAllFiles($path);
} else {
echo "문서: $path\n";
}
}
}
listAllFiles('/var/www/html/extracted');
위의 코드를 실행 한 후에는 디버깅 및 확인을 쉽게하기 위해 모든 압축 압축 파일과 폴더를 출력 할 수 있습니다.
모든 경로는 권한이나 경로 오류를 피하기 위해 절대 경로를 사용해야합니다.
제작 환경에서 디렉토리 트래버스 공격을 방지하기 위해 ZIP 파일의 소스에주의를 기울이십시오 (예 : Zip은 ../../ );
경로는 RealPath () 와 함께 정규화 될 수 있습니다.
파일이 크면 메모리 오버플로를 방지하기 위해 스트리밍 읽기를 사용하는 것이 좋습니다.
이 스크립트는 압축 파일을 업로드하고 자동으로 압축 해제하는 데 적합합니다. 예를 들어, 사용자가 멀티 레이어 디렉토리 구조가 포함 된 zip 파일을 m66.net/upload 에 업로드하는 경우 배경은 위의 스크립트를 통해 M66.net/storage 디렉토리의 전체 구조를 직접 복원 할 수 있으며 썸네일 생성, 레포 스캔 또는 백업 만들기와 같은 컨텐츠를 추가 처리 할 수 있습니다.
이러한 방식으로 컨텐츠 업로드 및 파일 초기화의 워크 플로우를 크게 단순화하고 개발 효율성을 향상시킬 수 있습니다.