【问题标题】:How can i validate file upload using Respect\Validation library?如何使用 Respect\Validation 库验证文件上传?
【发布时间】:2018-11-21 04:17:25
【问题描述】:

我在我的项目中使用Slim 3 Framework,并且我有一个包含 3 个输入的表单:'file', 'name', 'firstname'

假设$request 有我表单的数据输入,为了获取上传的文件,我使用此代码

$files = $request->getUploadedFiles();
    if (empty($files['file'])) {
        throw new Exception('Invalid image');
    }
$newfile = $files['file'];

然后,为了验证我的输入表单,我使用 Respect\Validation

$validation = $this->validator->validate($request, [
        'file' => v::file()->mimetype('application/pdf'),
        'name' => v::stringType()->notEmpty()->length(2, 50)->alpha(),
        'firstname' => v::stringType()->notEmpty()->length(2, 50)->alpha()
]);


if($validation->failed() {
     //...
}

事实是文件验证总是失败:

var_dump($request->getParam('file')); //return NULL
var_dump($newfile); //return the following

$newfile内容

object(Slim\Http\UploadedFile)#59 (8) { 
    ["file"]=> string(14) "/tmp/php409Uje" 
    ["name":protected]=> string(47) "Myfile.pdf" 
    ["type":protected]=> string(15) "application/pdf" 
    ["size":protected]=> int(1404476) ["error":protected]=> int(0) 
    ["sapi":protected]=> bool(true) ["stream":protected]=> NULL 
    ["moved":protected]=> bool(false) 
}

所以现在我被困住了。我真的不知道如何告诉验证器验证 $newfile MIMETYPE 的“文件”输入。

【问题讨论】:

  • 根据文档 (github.com/Respect/Validation/blob/1.1/docs/Mimetype.md),这应该可以工作:'file' => v::mimetype('application/pdf')
  • 是的,当然,我在发布之前检查了文档,并尝试过,但正如我在帖子中提到的,file 返回 NULL,因为我需要 -i think- 使用 getUploadedFiles( ),所以验证总是会失败,因为 NULL 不是 application/pdf 类型
  • 你能告诉我$this->validator是什么吗?或代码,您在 $container? 中初始化它?
  • $container['validator'] = function ($container) { return new App\Validation\Validator; };
  • 我不认为这是问题所在,一切都运行良好,我只是卡在文件验证上

标签: php file upload slim respect-validation


【解决方案1】:

也许为时已晚,但你可以试试

v::objectType()->attribute('file', v::oneOf(
    v::mimetype('application/pdf'),
    v::mimetype('image/png')
))->validate($uploadedFile);

其中 $uploadedFile 是 \Slim\Http\UploadedFile 的一个实例

您可以在“oneOf”中添加任意数量的验证器

【讨论】:

    【解决方案2】:

    您可以使用UploadedFile classfile 属性验证mimetype。

    例如:

    $uploadedFiles = $request->getUploadedFiles();
    $uploadedFile = $uploadedFiles['file'];
    
    $validationResult = v::file()->mimetype('application/pdf')->validate($uploadedFile->file);
    if($validationResult){
        echo "Validation ok";
    } else {
        echo "Validation error";
    }
    

    文件和其他参数以不同的方式处理,因此您无法使用经典的getParam($name) 方法访问文件。 坏消息是您不能使用单个验证步骤,但您必须对所有 POST 参数使用一个,对文件使用另一个。这意味着在您的特定情况下,您必须执行以下操作:

    $validation = $this->validator->validate($request, [
            'file' => v::file()->mimetype('application/pdf'),
            'name' => v::stringType()->notEmpty()->length(2, 50)->alpha(),
            'firstname' => v::stringType()->notEmpty()->length(2, 50)->alpha()
    ]);
    
    $uploadedFiles = $request->getUploadedFiles();
    
    if (empty($uploadedFiles['file'])) {
        throw new Exception('Invalid image');
    }
    
    $uploadedFile = $uploadedFiles['file'];
    
    $fileValidationResult = v::file()->mimetype('application/pdf')->validate($uploadedFile->file);
    
    if($validation->failed() || !$fileValidationResult) {
         //...
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-05
      • 1970-01-01
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多