어떻게 Laravel 에서 zip 의 파일 을 검증 합 니까?

6252 단어 Laravelzip
개술
만약 에 사용자 가 ZIP 파일 을 업로드 하 기 를 원한 다 면 우 리 는 규칙 과 결합 하여 다음 과 같은 내용 으로 사용 할 수 있 습 니 다.

return [
    'file' => 'required|file|mimes:zip|size:3072'
];
그러나 그림,텍스트 또는 pdf 파일 과 달리 ZIP 은 압축 파일 로 여러 개의 다른 파일 을 저장 할 수 있 습 니 다.사용자 가 ZIP 파일 을 업로드 하 기 를 원 하지만 특정한 필수 파일 과 폴 더 구 조 를 가지 고 있다 고 가정 합 니 다.예 를 들 어 워드 프레스 를 사용 하고 ZIP 파일 로 테 마 를 설치 한 적 이 있다 면 워드 프레스 는 테마 ZIP 파일 에 특정한 파일 을 요구 합 니 다.예 를 들 어 style.css 나 post.php.Laravel 에서 필요 한 모든 파일 이 포함 되 어 있 는 지 확인 하기 위해 서 올 린 ZIP 파일 을 어떻게 검증 합 니까?
PHP 의 libzip 확장
php 의 libzip 확장 지원 이 필요 합 니 다.이 확장 기능 의 사용 및 구체 적 인 용법 은 문서 official documentation 페이지 를 보십시오.
ZIP 파일 을 어떻게 조작 합 니까?
첫 번 째,ZipArchive 류 를 예화 합 니 다.

$zip = new \ZipArchive();
그런 후에 우 리 는 open()방법 을 통 해 ZIP 문 서 를 풀 수 있다.

$zip->open('/absolute/path/to/file.zip');
방법의 공식 문서 에 따 르 면 ZIP 파일 을 성공 적 으로 열 면'true'로 돌아 갑 니 다.그렇지 않 으 면 정수 오류 코드 를 되 돌려 줍 니 다.우 리 는 이렇게 모든 내용 을 검사 할 수 있다.

$zipStatus = $zip->open('/absolute/path/to/file.zip');
if (zipStatus !== true) {
    threw new \Exception('Could not open ZIP file. Error code: ' . zipStatus);
}
 
//    ,    …
ZipArchive 류 는 ZIP 파일 의 내용 을 읽 을 수 있 도록 다양한 방법 을 제공 합 니 다.그 중 일 부 는?
  • count()-ZIP 파일 의 파일 수 를 되 돌려 줍 니 다
  • getFromIndex()-지정 한 색인 에 대응 하 는 파일 을 되 돌려 줍 니 다
  • getNameIndex()-지정 한 색인 을 되 돌려 주 는 파일 이름
  • statIndex()-지정 한 색인 에 대응 하 는 파일 의 상세 한 정보(파일 이름,크기 등)를 되 돌려 줍 니 다
  • ZIP 파일 에 사용 가능 한 파일 목록 을 얻 으 려 면 이런 방법 이 있 습 니 다.우 리 는 이렇게 할 수 있다.
    
    $filesInside = [];
    for ($i = 0; $i < $zip->count(); $i++) {
        array_push($filesInside, $zip->getNameIndex($i));
    }
     
    $zip->close();
    하나의 ZipArchive 인 스 턴 스 가 ZIP 파일 을 동시에 처리 할 수 있 기 때문에 이 파일 을 처리 한 후에 close()방법 을 사용 해 야 합 니 다.여러 개의 ZIP 파일 을 반복 적 으로 탐색 하거나 새 ZIP 파일 을 만 들 때 특히 중요 합 니 다.
    ZipArchive 를 사용 할 때 주의해 야 할 것 이 있 습 니 다."enity"의 개념 은 파일 뿐만 아니 라 모든 폴 더 와 하위 폴 더 도 포함 되 어 있 습 니 다.이 말 을 어떻게 이해 하지?만약 에 우리 가 다음 과 같은 디 렉 터 리 구 조 를 가 진 문서 가 있다 면:
    - invoice.pdf
    - profile_picture.jpg
    - documents/
      - homework.doc
    - bills/
      - january/
        - payment.pdf
    현재 문서 에 count()작업 을 실행 하면 현재 파일 의 수 를 얻 을 수 있 습 니 다.비록 4 개의 파일 만 있 지만 count()방법 은 7 을 되 돌려 줍 니 다.왜 일 까요?$files Inside 를 인쇄 해서 그 안에 무엇이 포함 되 어 있 는 지 봅 시다.
    
    $files = [
        'invoice.pdf',
        'profile_picture.jpg',
        'documents/',
        'documents/homework.doc',
        'bills/',
        'bills/january/',
        'bills/january/payment.pdf'
    ];
    인쇄 결과 에 파일 뿐만 아니 라 해당 폴 더 도 있 는 것 을 볼 수 있 습 니 다.getNameIndex()방법 으로 전체 파일 경 로 를 가 져 올 수 있 습 니 다.
    Laravel 프로그램 에 통합
    이제 우 리 는 PHP 를 사용 하여 ZIP 파일 목록 을 가 져 오 는 방법 을 알 게 되 었 습 니 다.모든 내용 을 Laravel 에 통합 시 키 고 업로드 한 ZIP 파일 에 필요 한 파일 이 포함 되 어 있 는 지 검증 합 니 다.
    사용자 가 ZIP 파일 을 업로드 해 야 하고 파일 의 assets 디 렉 터 리 에 thumbnail.jpg 와 style.css 파일 이 포함 되 어야 한다 고 가정 합 니 다.
    - thumbnail.jpg
    - assets/
      - style.css
    이것 은 우리 의 컨트롤 러 입 니 다.이 컨트롤 러 는 zip 라 는 이름 을 가지 고 있 습 니 다.file 파일 업로드:
    
    namespace App\Controllers;
    use Illuminate\Http\Request;
     
    class UploadController
    {
        const REQUIRED_FILES = [
            'thumbnail.jpg',
            'assets/style.css',
        ];
     
        public function upload(Request $request)
        {
            $zip = new \ZipArchive();
            $file = $request->file('zip_file');
        }
    }
    Illuminate\Http\Request 에서 데 이 터 를 검색 할 때 모든 파일 은 Illuminate\Http\UploadedFile 인 스 턴 스 를 되 돌려 줍 니 다.업로드 한 임시 파일 의 절대 경 로 를 path()방법 으로 되 돌려 줄 수 있 습 니 다.
    이것 은 우리 가 ZIP 파일 을 열 고 ZipArchive 류 를 사용 하여 모든 파일 을 표시 하 는 방법 입 니 다.
    
    public function upload(Request $request)
    {
        $zip = new \ZipArchive();
        $file = $request->file('zip_file');
        $zip->open($file->path());
     
        $filesInside = [];
        for ($i = 0; $i < $zip->count(); $i++) {
            array_push($filesInside, $zip->getNameIndex($i));
        }
    }
    이제 우 리 는 array 와 같은 것 을 사용 할 수 있다.intersect()같은 방법 으로 REQUIREDFILES 와$files Inside 를 비교 합 니 다.만약 교 집합 원소 의 수량 이 REQUIRED 와 같 지 않다 면FILES 의 요소 수 는 업 로드 된 ZIP 파일 에 필요 한 모든 파일 이 존재 하지 않 음 을 의미 하기 때문에 인증 오 류 를 중단 하거나 되 돌 릴 수 있 습 니 다.
    
    $intersection = array_intersect(self::REQUIRED_FILES, $filesInside);
     
    if (count($intersection) !== count(self::REQUIRED_FILES)) {
        abort(422);
    }
    이것 은 우리 의 컨트롤 러 입 니 다.모든 것 이 준비 되 었 습 니 다.
    
    namespace App\Controllers;
    use Illuminate\Http\Request;
     
    class UploadController
    {
        const REQUIRED_FILES = [
            'thumbnail.jpg',
            'assets/style.css',
        ];
     
        public function upload(Request $request)
        {
            $zip = new \ZipArchive();
            $file = $request->file('zip_file');
            $zip->open($file->path());
     
            $filesInside = [];
            for ($i = 0; $i < $zip->count(); $i++) {
                array_push($filesInside, $zip->getNameIndex($i));
            }
     
            $intersection = array_intersect(self::REQUIRED_FILES, $filesInside);
     
            if (count($intersection) !== count(self:: REQUIRED_FILES)) {
                abort(422);
            }
     
            // ZIP contains all required files, continue
        }
    }
    최선 의 실천
    Laravel 응용 프로그램 에서 가장 좋 은 실천 은 검증 과 관련 된 내용 을 컨트롤 러 에서 옮 기 는 것 이다.일반적인 옵션 은 다음 과 같 습 니 다:
    사용자 정의 인증 규칙 클래스 만 들 기
  • 이미 존재 하 는 요청 검증 대상 에서 패 킷 검증 을 사용 합 니 다
  • 인증 규칙 의 확장 을 만 듭 니 다
  • ZIP 콘 텐 츠 검증 의 필요 로 저 는 Laravel 패 키 지 를 만 들 었 습 니 다.이 패 키 지 는 본 블 로그 글 에서 말 한 모든 작업 을 완 성 했 고 더 많은 옵션 과 기능 을 제공 합 니 다.GitHub 페이지 에서 orkhanahmadov/ravel-zip-vaidator 를 보고 더 많은 정 보 를 얻 고 사용 하 는 방법 을 볼 수 있 습 니 다.
    이상 은 Laravel 에서 zip 에 있 는 파일 의 상세 한 내용 을 검증 하 는 방법 입 니 다.Laravel 에서 zip 에 있 는 파일 을 검증 하 는 데 관 한 자 료 는 다른 관련 글 에 주목 하 십시오!

    좋은 웹페이지 즐겨찾기