【问题标题】:The best practies for upload file in Symfony 3Symfony 3 中上传文件的最佳实践
【发布时间】:2017-09-12 18:38:08
【问题描述】:

我学习了 Symfony 3,我想创建表单类来上传文件,所以我创建了 ImageType,cutom 表单类型来处理以 NewsType 上传的图像(带有一些描述和这个字段的表单):

class ImageType extends AbstractType
{
    private $path;

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

    public function getParent()
    {
        return FileType::class;
    }

    public function getName()
    {
        return 'image';
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'image_name' => ''
        ));
    }

    /**
     * @param FormView $view
     * @param FormInterface $form
     * @param array $options
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['image_name'] = $options['image_name'];
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder
            ->setAttribute('image_name', $options['image_name'])
            ->addModelTransformer(new ImageTransformer($this->path))

    }
}

我使用 ImageTransformer 将文件名(如 124324235342.jpg)转换为实例 File 类。当我创建并将日期保存到数据库时,表单工作正常,但如何在编辑模式下管理实体?

public function editAction(Request $request, News $news)
{
    $path = $this->getParameter('upload_directory') . $news->getImage();
    $image = $news->getImage();
    $form = $this->createForm(NewsType::class, $news, ['image_name' => $image]);
    $form->handleRequest($request);

    if($form->isSubmitted() && $form->isValid())
    {
        $this->get('app.image_uploader')->uploadNews($news, $image);

        $em = $this->getDoctrine()->getManager();
        $em->persist($news);
        $em->flush();

        return $this->redirectToRoute('admin_news_index');
    }

    return $this->render('admin/news/form.html.twig', [
        'form' => $form->createView(),
        'news' => $news
    ]);
}

我希望处理案例使用相同的表单来编辑数据库实体。我填充了表单,但是当用户不上传图片时,我不想更改此字段并使用旧值。如何做到这一点?

【问题讨论】:

    标签: forms symfony


    【解决方案1】:

    最简单的代码方法:

    News 的设置器中输入:

    function setImage($image) {
        if(strlen($image)) {
              $this->image = $image;
        }
    }
    

    当用户编辑其他字段时,这使您不必担心缺少图像的情况。在这种情况下,News 中的 $this->fileName 不会被覆盖。

    然后在服务app.image_uploader 中,您应该检查是否存在具有给定名称的文件。如果没有,那么你不应该覆盖这个文件。

    但还有其他一些问题:

    1) 您应该验证文件的扩展名。

    2) 您应该为服务器中的文件使用不同于用户名称的唯一名称。你可以使用这两个名称,硬盘中的字符串文件的唯一名称,以及用户界面中的用户名,但你不应该使用文件形式的用户名来存储文件到你的硬盘。

    我建议阅读有关这些问题的文档:

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

    或堆栈溢出:

    Symfony2 file upload step by step

    【讨论】:

    • 感谢您的回复,但是使用 empty_data 怎么样?在将数据从实体和 empty_data 设置为字段后,是否有一些修改表单的提示?
    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 2023-03-06
    • 2013-01-28
    • 1970-01-01
    • 2013-06-26
    • 2012-05-07
    • 2010-09-24
    • 2010-09-22
    相关资源
    最近更新 更多