Symfony2:如何在没有表单的情况下验证UploadedFile?

时间:2015-08-07 20:07:15

标签: validation symfony doctrine-extensions doctrine-uploadable

我需要下载文件从URL下载到我的服务器并使用Uploadable (DoctrineExtensions)保留。几乎一切正常,我的方法是:

  1. curl的文件下载到我服务器上的临时文件夹
  2. 创建UploadedFile方法并使用属性值填充
  3. 将其插入可上传的实体Media
  4. 执行验证
  5. 坚持和冲洗
  6. 简化代码:

    // ... download file with curl
    
    // Create UploadedFile object
    $fileInfo = new File($tpath);
    $file = new UploadedFile($tpath, basename($url), $fileInfo->getMimeType(), $fileInfo->getSize(), null);
    
    // Insert file to Media entity
    $media = new Media();
    $media = $media->setFile($file);
    $uploadableManager->markEntityToUpload($media, $file);
    
    // Validate file (by annotations in entity)
    $errors = $validator->validate($media);
    
    // If no errors, persist and flush
    if(empty($errors)) {
        $em->persist($this->parentEntity);
        $em->flush();
    }
    

    如果我跳过验证,一切正常。文件成功移动到正确的路径(由config.yml中的可上载扩展名配置)并持久保存到数据库。但是使用manualy创建的UploadedFile验证会返回此错误:

      

    无法上传文件。

    我可以禁用Validator从URL上传并使用自定义方法验证文件,但使用Symfony Validator对象对我来说似乎是一个更清晰的解决方案。

    有没有办法让它发挥作用?

1 个答案:

答案 0 :(得分:3)

在symfony验证组件中,约束UploadedFile在内部使用此功能http://php.net/manual/es/function.is-uploaded-file.php

你可以在https://github.com/symfony/HttpFoundation/blob/master/File/UploadedFile.php#L213

看到它
function pushparametricdata(df, full) 
    for m = eachmatch(r"section:(.*)\r\nsubsection:([0-9]*)\r\n((xy:[0-9]*_.*?\r\n)+)"m, full)
        for r = eachmatch(r"xy:([0-9]+)_(.*?)\r\n"m, m.captures[3])
            push!(df, [m.captures[1], int(m.captures[2]), int(r.captures[1]), float(r.captures[2])])
        end
    end
end

您必须创建自己的Downloadvalidator(是的,您实际上是通过curl下载文件)