Symfony 4 文件上传

3

如何在Symfony 4中上传文件。我已经按照Symfony文档的步骤进行了操作,但不知道哪里出错了。在上传文件时出现错误,请给我一些提示。

参考链接:

https://symfony.com/doc/current/controller/upload_file.html

错误信息:

The file "" does not exist

实体

    public function getBrochure()
    {
        return $this->brochure;
    }

    public function setBrochure($brochure)
    {
        $this->brochure = $brochure;

        return $this;
    }

文件上传监听器
class FileUploader
{
    private $targetDirectory;

    public function __construct($targetDirectory)
    {
        $this->targetDirectory = $targetDirectory;
    }

    public function upload(UploadedFile $file)
    {
        $fileName = md5(uniqid()).'.'.$file->guessExtension();

        $file->move($this->getTargetDirectory(), $fileName);

        return $fileName;
    }

    public function getTargetDirectory()
    {
        return $this->targetDirectory;
    }
} 

我在这一行代码中遇到了错误:$fileName = md5(uniqid()).'.'.$file->guessExtension(); - viveka
文件正在上传,但显示以下错误:“/tmp/phpoblzuA”文件不存在。 - viveka
1个回答

1
这个Symfony教程对我来说很好,所以我会尝试解释一下如何操作,或许能帮到你或其他还在寻找答案的人,因为这篇文章有点老了。
首先,你需要创建一个FileUploader服务在App\Service中,以便更好地重用 (章节:创建上传服务)。你可以基本上复制/粘贴他们在这里所做的,它能够很好地工作。然后你需要打开Config文件夹中的services.yaml文件,并显式指定你的brochure目录:
parameters:
    brochures_directory: '%kernel.project_dir%/public/uploads/brochures'
# ...
services:
    # ...

    App\Service\FileUploader:
        arguments:
            $targetDirectory: '%brochures_directory%'

现在一切都已经准备就绪,可以使用您的FileUploader服务。 因此,如果您在控制器中(例如),我猜您想在表单中使用它。因此,您只需执行以下操作(不要忘记在控制器中使用您的服务):
public function myController(FileUploader $fileUploader)
{
    // Create your form and handle it

    if ($form isValid() && &form isSubmitted()) {
        $file = $myEntity->getBrochure();
        $fileName = $this->fileUploader->upload($file);
        $myEntity->setBrochure($fileName);

        // Form validation and redirection
    }
    // Render your template
}

我忘了说一个重要的点。在你的表单类型中,你需要说明Brochure将是一个FileType:

$builder->add('brochure', FileType::class)

但是在实体中,您必须指定您的手册存储为"字符串":

/**
 * @MongoDB\Field(type="string")
 */
 protected $brochure;

原因是您的文件正在上传并保存在public/uploads/brochure中。但是,您的数据库仅记住了到达该文件的字符串路径。
希望这可以帮助您!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接