Symfony2: Edit file upload

2019-03-13 22:43发布

I am using the cookbook article from symfony.com to implement a file upload option for images.

Now I want to load up other images to the entity.

The default strategy for editing is: 1. Fetch out of DB 2. Inject into Form 3. Persist

Somehow this strategy doesn't work anymore when using file uploads (doctrine doesn't execute the events)

What else could I do to make the articles with picture editable?

3条回答
聊天终结者
2楼-- · 2019-03-13 23:04

I have was in similar situation. I try to edit existing record in database with path to the file. When i edit record i must upload new file, what is not comfortable for users. In my solution i use variable tmp file for file hash and variable file name. All needed operation i made in Action edit class.

Full example action class in bellow link

https://github.com/marekz/php_examples/wiki/Symfony-how-to-edit-attachment-form

查看更多
相关推荐>>
3楼-- · 2019-03-13 23:12

The cookbook does not handle updates, in particular in the case where only the file changes.

In this case, the PreUpdate event is not triggered, so you need to trigger $entity->preUpload() manually before the $em->persist($entity), so that the file upload gets handled in any case (preUpload will alter $entity->path so the persisting will occur)

查看更多
成全新的幸福
4楼-- · 2019-03-13 23:27

If you change only the upload field the lifecycle not run the upload method, In the cookbook is reported the solution in a quote box as below:

The PreUpdate and PostUpdate callbacks are only triggered if there is a change in one of the entity's field that are persisted. This means that, by default, if you modify only the $file property, these events will not be triggered, as the property itself is not directly persisted via Doctrine. One solution would be to use an updated field that's persisted to Doctrine, and to modify it manually when changing the file.

add a dummy field to update in the controller before persist event as suggest by this duscussion:

https://github.com/symfony/symfony-docs/pull/564

public function setFile(UploadedFile $file)
{
    $this->file = $file;
    $this->updatedAt = new \DateTime();
}
查看更多
登录 后发表回答