添加第二个文件字段时,Symfony2文件上传失败


Symfony2 file upload fails when second file field is added

我试图上传2个图像与2个表单字段。我的形式:

        ->add('zdjecie', FileType::class, array('label' => 'Zdjecie (img file)'))
        ->add('zdjecieMIN', FileType::class, array('label' => 'Zdjecie miniatura (img file)'))
实体:

/**
 * @ORM'Column(type="string")
 *
 * @Assert'NotBlank(message="Dodaj zdjecie miniaturke")
 * @Assert'File(mimeTypes={"image/png", "image/jpeg", "image/jpg",})
 */
private $zdjecieMIN;
public function getZdjecieMIN()
{
    return $this->zdjecieMIN;
}
public function setZdjecieMIN($zdjecieMIN)
{
    $this->zdjecieMIN = $zdjecieMIN;
    return $this;
}
/**
 * @ORM'Column(type="string")
 *
 * @Assert'NotBlank(message="Dodaj zdjecie")
 * @Assert'File(mimeTypes={"image/png", "image/jpeg", "image/jpg",})
 */
private $zdjecie;
public function getZdjecie()
{
    return $this->zdjecie;
}
public function setZdjecie($zdjecie)
{
    $this->zdjecie = $zdjecie;
    return $this;
}

控制器:

 public function newAction(Request $request)
{
    $buty = new Buty();
    $form = $this->createForm('ShoeShopBundle'Form'ButyType', $buty);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $file = $buty->getZdjecie();
        $fileName = md5(uniqid()).'.'.$file->guessExtension();
        $file->move(
            $this->getParameter('img_directory'),
            $fileName
        );
        $buty->setZdjecie($fileName);
        $file2 = $buty->getZdjecieMIN();
        $fileName2 = md5(uniqid()).'.'.$file->guessExtension();
        $file2->move(
            $this->getParameter('img_directory'),
            $fileName2
        );
        $buty->setZdjecieMIN($fileName2);
        $em = $this->getDoctrine()->getManager();
        $em->persist($buty);
        $em->flush();
        return $this->redirectToRoute('app_admin_buty_show', array('id' => $buty->getId()));
    }
    return $this->render('ShoeShopBundle:Admin/Buty:new.html.twig', array(
        'buty' => $buty,
        'form' => $form->createView(),
    ));
}
配置:

parameters:
locale: en
img_directory: '%kernel.root_dir%/../web/uploads/img'

当我只使用1图像上传字段时,一切都很好,但现在我得到"文件"C:'xampp'tmp' phpb79 .tmp"不存在"错误,有人知道出了什么问题吗?提前感谢您的帮助。

编辑:添加了我的html/twig表单
{% extends 'base.html.twig' %}
{% block body %}
<div class="adm-new">
<h2>Dodaj nowy produkt</h2>
{{ form_start(form) }}
<div>
    {{ form_errors(form.marka) }}
    <div>
        <div>
            {{ form_label(form.marka) }}:
        </div>
    </div>
    <div>
        <div>
            {{ form_widget(form.marka) }}
        </div>
    </div>
</div>
<div>
    {{ form_errors(form.model) }}
    <div>
        <div>
            {{ form_label(form.model) }}:
        </div>
    </div>
    <div>
        <div>
            {{ form_widget(form.model) }}
        </div>
    </div>
</div>
<div>
    {{ form_errors(form.kolor) }}
    <div>
        <div>
            {{ form_label(form.kolor) }}:
        </div>
    </div>
    <div>
        <div>
            {{ form_widget(form.kolor) }}
        </div>
    </div>
</div>
<div>
    {{ form_errors(form.cena) }}
    <div>
        <div>
            {{ form_label(form.cena) }}:
        </div>
    </div>
    <div>
        <div>
            {{ form_widget(form.cena) }}
        </div>
    </div>
</div>
<div>
    {{ form_errors(form.rozmiar) }}
    <div>
        <div>
            {{ form_label(form.rozmiar) }}:
        </div>
    </div>
    <div>
        <div>
            {{ form_widget(form.rozmiar) }}
        </div>
    </div>
</div>
<div>
    {{ form_errors(form.zdjecieMIN) }}
    <div>
        <div>
            {{ form_label(form.zdjecieMIN) }}:
        </div>
    </div>
    <div>
        <div>
            {{ form_widget(form.zdjecieMIN) }}
        </div>
    </div>
</div>
<div>
    {{ form_errors(form.zdjecie) }}
    <div>
        <div>
            {{ form_label(form.zdjecie) }}:
        </div>
    </div>
    <div>
        <div>
            {{ form_widget(form.zdjecie) }}
        </div>
    </div>
</div>
    <div><input type="submit" value="Dodaj" /></div>
{{ form_end(form) }}
<ul>
    <li>
        <a href="{{ path('app_admin_buty_index') }}">Powrot do listy produktow</a>
    </li>
</ul>
</div>
{% endblock %}

我怀疑uniqid为两个上传生成相同的文件名,这就是您所看到的文件未找到问题的核心。

从PHP文档:

函数

获取基于当前时间(以微秒为单位)的前缀唯一标识符。

uniqid的两个调用执行得足够近,以至于基于函数的微秒时间部分,它可能会为它们分配相同的名称。因此,当您进入$file->move it时,第二个将"丢失"。

尝试在mt_rand中替换,以减少文件名冲突的可能性。您还可以通过在$file上调用getBasename,并将其连接到传递给md5的字符串来减轻这种可能性。

就像cameron Hurd建议的那样,这是uniqid为两个文件生成相同文件名的问题。mt_rand()函数给出了相同的结果所以我只是改变了

$file2 = $buty->getZdjecieMIN();
    $fileName2 = md5(uniqid()).'.'.$file->guessExtension();
    $file2->move(
        $this->getParameter('img_directory'),
        $fileName2
    );
    $buty->setZdjecieMIN($fileName2);

在我的控制器:

$ext_pos = strrpos($fileName, '.');
        $file2 = $buty->getZdjecieMIN();
        $fileName2 = substr($fileName, 0, $ext_pos) . '_min' . substr($fileName, $ext_pos);;
        $file2->move(
            $this->getParameter('img_directory'),
            $fileName2
        );
        $buty->setZdjecieMIN($fileName2);

感谢来自#symfony的Cameron和rodd的帮助。

我认为这不能解决你的问题,但你检查file2name扩展名从文件而不是从file2。如果你将文件移动到另一个地方,可能是移动文件上的guessExtension()的问题