我学习了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
]);
}
我希望句柄使用相同的表单来编辑数据库实体。我填写表格,但当用户没有上传图像我不想改变这个字段和旧的价值。怎么做到这一点?
答案 0 :(得分:0)
在News
类型的设置者中:
function setImage($image) {
if(strlen($image)) {
$this->image = $image;
}
}
当用户编辑其他字段时,这使您不必担心缺少图像的情况。在这种情况下,$this->fileName
中的News
将不会被覆盖。
然后在服务app.image_uploader
中,您应该检查是否存在具有给定名称的文件。如果没有,那么你不应该覆盖这个文件。
1)您应该验证文件的扩展名。
2)您应该为服务器中的文件使用与用户名称不同的唯一名称。 Yo可以使用这两个名称,您对硬盘中的字符串文件的唯一名称,以及用户界面中的名称形式用户,但您不应使用文件格式用户名来将文件存储在硬盘中。
我建议您在文档中了解这些问题:
或堆栈溢出: