我想只接受包含" .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
答案 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 );
}
?>
然后你可以查看你的条件。
中找到更多相关信息