我如何使用 Lavavel 标准函数验证上传的文件名
how can i validate the uploaded file name using Lavavel standard functions
我不确定检查插入的恶意代码是否有用,但我还是想实现它。
我想用一些 Laravel 验证来检查文件名字符串,而不用 php 特定函数,如果可能的话。
这是我的代码片段:
$valiadateResult = Validator::make
(
$inReq->all(),
[
'atitle' => 'required',
'keyw' => 'max:255|alpha_num',
'gkeyw' => 'max:255|alpha_num',
'up' => 'nullable|alpha_num|mimes:jpeg,jpg,png,gif,mp3,pdf|max:100000',
'intro' => 'max:255',
'full' => 'max:2000',
]
);
所以up
部分是文件验证,但它不检查文件名。
我试过了,但是 alpa_num 在这种情况下不起作用。
那么有没有使用某些 Laravel 函数的解决方案?或者我应该自己使用一些 PHP 逻辑来验证?或者您认为没有必要验证这样的输入?
此外,您还可以使用 "File" 验证。
验证字段必须是上传成功的文件。
'up' => 'file|nullable|alpha_num|mimes:jpeg,jpg,png,gif,mp3,pdf|max:100000',
您需要在输入和规则中添加另一个名为 filename
的文件。
$filename = $request->file('up')->getClientOriginalName();
$allInput = $inReq->all();
$allInput['filename'] = $filename;
$valiadateResult = Validator::make
(
$allInput,
[
'atitle' => 'required',
'keyw' => 'max:255|alpha_num',
'gkeyw' => 'max:255|alpha_num',
'up' => 'nullable|alpha_num|mimes:jpeg,jpg,png,gif,mp3,pdf|max:100000',
'filename' => 'alpha_num',
'intro' => 'max:255',
'full' => 'max:2000',
]
);
你会得到文件名错误
- 创建自定义验证规则 class,例如
Filename
,并将其放在路径 app/Rules/Filename.php
.
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
use Symfony\Component\HttpFoundation\File\UploadedFile;
class Filename implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
if (!($value instanceof UploadedFile) || !$value->isValid()) {
return false;
}
return preg_match('/^[\pL\pM\pN]+$/u', $value->getClientOriginalName()) > 0;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The :attribute name is invalid.';
}
}
- 在您的请求规则中添加如下自定义规则:
use App\Rules\Filename;
$valiadateResult = Validator::make(
$inReq->all(),
[
'atitle' => 'required',
'keyw' => 'max:255|alpha_num',
'gkeyw' => 'max:255|alpha_num',
'up' => ['nullable', new Filename, 'mimes:jpeg,jpg,png,gif,mp3,pdf', 'max:100000'],
'intro' => 'max:255',
'full' => 'max:2000',
]
);
我不确定检查插入的恶意代码是否有用,但我还是想实现它。
我想用一些 Laravel 验证来检查文件名字符串,而不用 php 特定函数,如果可能的话。
这是我的代码片段:
$valiadateResult = Validator::make
(
$inReq->all(),
[
'atitle' => 'required',
'keyw' => 'max:255|alpha_num',
'gkeyw' => 'max:255|alpha_num',
'up' => 'nullable|alpha_num|mimes:jpeg,jpg,png,gif,mp3,pdf|max:100000',
'intro' => 'max:255',
'full' => 'max:2000',
]
);
所以up
部分是文件验证,但它不检查文件名。
我试过了,但是 alpa_num 在这种情况下不起作用。
那么有没有使用某些 Laravel 函数的解决方案?或者我应该自己使用一些 PHP 逻辑来验证?或者您认为没有必要验证这样的输入?
此外,您还可以使用 "File" 验证。
验证字段必须是上传成功的文件。
'up' => 'file|nullable|alpha_num|mimes:jpeg,jpg,png,gif,mp3,pdf|max:100000',
您需要在输入和规则中添加另一个名为 filename
的文件。
$filename = $request->file('up')->getClientOriginalName();
$allInput = $inReq->all();
$allInput['filename'] = $filename;
$valiadateResult = Validator::make
(
$allInput,
[
'atitle' => 'required',
'keyw' => 'max:255|alpha_num',
'gkeyw' => 'max:255|alpha_num',
'up' => 'nullable|alpha_num|mimes:jpeg,jpg,png,gif,mp3,pdf|max:100000',
'filename' => 'alpha_num',
'intro' => 'max:255',
'full' => 'max:2000',
]
);
你会得到文件名错误
- 创建自定义验证规则 class,例如
Filename
,并将其放在路径app/Rules/Filename.php
.
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
use Symfony\Component\HttpFoundation\File\UploadedFile;
class Filename implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
if (!($value instanceof UploadedFile) || !$value->isValid()) {
return false;
}
return preg_match('/^[\pL\pM\pN]+$/u', $value->getClientOriginalName()) > 0;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The :attribute name is invalid.';
}
}
- 在您的请求规则中添加如下自定义规则:
use App\Rules\Filename;
$valiadateResult = Validator::make(
$inReq->all(),
[
'atitle' => 'required',
'keyw' => 'max:255|alpha_num',
'gkeyw' => 'max:255|alpha_num',
'up' => ['nullable', new Filename, 'mimes:jpeg,jpg,png,gif,mp3,pdf', 'max:100000'],
'intro' => 'max:255',
'full' => 'max:2000',
]
);