5

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

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

简化代码:

// ... 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 中的 Uploadable 扩展配置)并持久化到数据库。但是手动创建的验证会UploadedFile返回此错误:

无法上传文件。

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

有什么办法让它工作吗?

4

1 回答 1

3

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

你可以在这里看到它https://github.com/symfony/HttpFoundation/blob/master/File/UploadedFile.php#L213

/**
 * Returns whether the file was uploaded successfully.
 *
 * @return bool True if the file has been uploaded with HTTP and no error occurred.
 *
 * @api
 */
public function isValid()
{
    $isOk = $this->error === UPLOAD_ERR_OK;
    return $this->test ? $isOk : $isOk && is_uploaded_file($this->getPathname());
}

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

于 2015-08-07T20:45:15.587 回答