Laravel验证zip文件内容

时间:2017-12-02 09:22:16

标签: php laravel

我想只接受包含" .zip"的文件。延期。我添加了一个规则mime-type application/zip来控制它。但我不知道它的内容所以我需要检查zip文件的内容,以避免未知文件。如何安全地控制zip文件的内容?

我正在使用https://github.com/Chumper/Zipper来提取和  laravel版本是5.5

public function store(Request $request, User $sharingUser) {
        $rules = [
            'patient_case_id'   => 'required|exists:patient_cases,id',
            'file'              => 'required|mimes:zip,rar',
        ];  
}

上传了zip文件的内容树,如下所示:

xxxx - MAIN FOLDER

| - aaaa.adf

| - bbbb.adf

| - cccc.adf

| - dddd.adf

| - aaaa.ocx

文件夹只能包含.adf和.ocx文件......但我不知道文件夹中有多少文件。

注意:它是RESTful API

2 个答案:

答案 0 :(得分:4)

我建议您改用PHP League's ZipArchive Adapter

创建新的validation rule。在请求中设置规则,然后定义逻辑。

use League\Flysystem\Filesystem;
use League\Flysystem\ZipArchive\ZipArchiveAdapter;

$filesystem = new Filesystem(new ZipArchiveAdapter(getrealpath($value)));

passes()方法中,将文件系统设置为读取文件。我想你可能需要弄清楚临时存储realpath($value)中文件的路径。

然后充实检查的逻辑。您可以像这样遍历文件:

foreach ($filesystem->listContents() as $object) {
    if (!in_array($object['mimetype'], ['mimetype1', 'mimetype2'])) {
        return false;
    }

}
return true;

我无法记住listContents()是否递归列出所有文件,但可能有一个选项可以让它这样做,请查看他们的文档。你不必使用mimetype比较,只需使用最有意义的东西。

答案 1 :(得分:1)

我想你想知道zip文件夹的内容而不提取它然后只接受它吗?

您可以使用此代码了解zip文件夹的内容。

<?php
$za = new ZipArchive(); 

$za->open('theZip.zip'); 

for( $i = 0; $i < $za->numFiles; $i++ ){ 
    $stat = $za->statIndex( $i ); 
    print_r( basename( $stat['name'] ) . PHP_EOL ); 
}
?>

然后你可以查看你的条件。

您可以在http://www.php.net/ziparchive

中找到更多相关信息