【问题标题】:Symfony sfWidgetFormInputFile deleted my fileSymfony sfWidgetFormInputFile 删除了我的文件
【发布时间】:2012-07-07 20:48:20
【问题描述】:

很抱歉有很多问题,但我是 Symfony 的新手。我做了一个表格,一切都很好。我有几个图片字段(图片1、图片2、图片3等)。我使用了 te sfWidgetFormInputFile 并且一切都很好。它将文件上传到需要的位置,并为其指定一个唯一的名称。

我遇到的问题是这些字段在 mySQL 中设置为具有“no-pic.png”的默认值,因此如果用户不上传图片,它仍然会显示一些内容帖子。但是每次有人上传图片时,它都会删除我的 no-pic.png 文件,并且没有图片的帖子会显示为空白方块。我想这是因为它在上传新图片之前设置为“删除以前的图片”,以减少服务器上多余的未使用图片。

我想知道是否有办法让它在从文件夹中删除它之前检查值是否为“no-pic.png”。如果有帮助,这是我在 form.class 文件中使用的代码。

      $this->widgetSchema['picture1'] = new sfWidgetFormInputFile(array('label' => 'Pictures', ));
  $this->validatorSchema['picture1'] = new sfValidatorFile(array('required' => false, 'path' => sfConfig::get('sf_upload_dir').'/car', 'mime_types' => 'web_images', ));
  $this->widgetSchema['picture1'] = new sfWidgetFormInputFileEditable(array(
    'label' => 'Pictures',
    'file_src' => '/uploads/car/'.$this->getObject()->getPicture1(),
    'is_image' => true,
    'edit_mode' => !$this->isNew(),
    'template' => '<div>%file%<br />%input%<br />%delete%%delete_label%</div>',
    ));
  $this->validatorSchema['picture_delete'] = new sfValidatorPass();

【问题讨论】:

  • 如果您允许他们编辑图片上传,则不需要第一行。 symfony 会为您处理上传和删除,但由于某种原因,它不允许您同时删除和上传新文件(至少根据我的经验)。
  • 酷。我拿出第一行,它仍然有效,但我需要能够自己控制删除。我刚刚添加了一个帖子,上传了一张图片,然后 no-pic.png 就不见了。我什至尝试将其设为只读。它仍然会删除它。
  • 哦,好的。我更了解你想做什么。防止这种情况发生的最简单方法可能是在控制器中绑定表单,检查它是否是删除并且图片不是 no-pic.png。如果两个条件都为假,则抓取对象并更新它。如果您希望它自动处理删除并为您保存但不能真正执行您想要的自定义逻辑,则 bindAndSave 非常有用。

标签: symfony1 upload image overwrite


【解决方案1】:

我找到了解决方法。我检查了页面是否设置为 no-pic.png,然后它在另一个位置显示 no-pic.png。这样当它上传图片时,它不会删除它。 :) 感谢您的帮助。

【讨论】:

  • 很酷的交易。我找到了我使用的代码并将其发布以供参考。虽然它更简单,但 symfony 完成了所有工作
【解决方案2】:

我使用的代码仅供参考。

$this->setWidget('logo_image', new sfWidgetFormInputFileEditable(array(
  'file_src'  => 'uploads/logos/'.$this->getObject()->getFilename(),
  'edit_mode' => !$this->isNew()
)));

$validatorOptions = array(
  'max_size'           => 1024*1024*10,
  'path'               => sfConfig::get('sf_upload_dir').'/logos',
  'mime_type_guessers' => array(),
  'required'           => false
);

if ($this->isNew())
{
  $validatorOptions['required'] = true;
}

$this->setValidator('logo_image', new sfValidatorFile($validatorOptions));
$this->setValidator('logo_image_delete', new sfValidatorString(array('required' => false)));

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    相关资源
    最近更新 更多