我尝试使用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 \ phpBF79.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 %}
答案 0 :(得分:0)
我怀疑uniqid
为两个上传产生了相同的文件名,而这正是您所看到的文件未找到问题的核心。
来自PHP文档:
uniqid
根据当前时间(以微秒为单位)获取带前缀的唯一标识符。
对uniqid
的两次调用都执行得足够接近,基于函数的微秒时间部分,它可能会为它们分配相同的名称。因此,第二个将缺失&#34;当你转到$file->move
它。
尝试在mt_rand
中进行子搜索,以避免文件名冲突的可能性。您还可以通过调用getBasename
上的$file
并将其连接到传递给md5
的字符串来缓解这种可能性。
答案 1 :(得分:0)
像Camerun 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的所有帮助。
答案 2 :(得分:-1)
我认为它不能解决您的问题,但您从文件中检入file2name扩展名而不是从file2中检入。 如果你将文件移动到另一个地方,可能是在移动文件上的guessExtension()问题。