带/多个文件的Zend文件传输不会同等上传

时间:2011-05-19 17:37:16

标签: zend-framework file-upload zend-file

奇怪的标题,是的,但问题很简单;只是加重。我有一个表单,我没有使用Zend_Form,它有两个文件上传:

<input name="image" type="file" />
<input name="file" type="file" />

以下是我的控制器处理上传的代码块。实际上还有一点,但这是相关的部分:

$data['image'] = (isset($_FILES["image"]) && $_FILES["image"]["name"] ? $_FILES["image"]["name"] : NULL);
$data['file'] = (isset($_FILES["file"]) && $_FILES["file"]["name"] ? $_FILES["file"]["name"] : NULL);

$options = array('ignoreNoFile' => TRUE);
$upload = new Zend_File_Transfer();

$upload->setOptions($options)
       ->addFilter('Rename', array('target' => RESOURCES_IMG . $data['image'], 'overwrite' => TRUE), 'image')
       ->addFilter('Rename', array('target' => RESOURCES_FILES . $data['file'], 'overwrite' => TRUE), 'file')
       ->addValidator('ImageSize', false, array('minwidth'  => 100,
                                                'maxwidth'  => 100,
                                                'minheight' => 100,
                                                'maxheight' => 100), 'image')
       ->addValidator('Extension', false, 'jpg', 'image');

if (!$upload->isValid())
{
 echo '<h1>Oops</h1><p>Please correct the following errors: <hr /></p>';

 foreach ($upload->getMessages() as $key => $val)
 {
  echo '<p><strong>' . $key . '</strong><br />' . $val . '</p>';
 }
 die;
}
else
{
 $upload->receive();
} // if (!$upload->isValid())

这很直截了当。 $ data的东西只是我抓取文件名,如果它在那里或将变量设置为NULL。我将addFilter()和addValidator()分段为仅影响其相关文件,在这种情况下为“image”或“file” - 表单字段的名称。

“文件”上传始终有效!但是,“图像”上传没有,而且它还将临时文件放入RESOURCES_FILES目录,这完全没有意义。因此该目录包含PDF以及除php8TJT13,phpXmOzQM等文件之外的任何其他内容。

我一直在盯着这段代码搜索Stack Overflow以及Google会出现什么,我找不到有人遇到这个问题。救命啊!

1 个答案:

答案 0 :(得分:4)

好吧,所以我做了更多的挖掘,事实证明我的链接方式可能存在问题addFilter()所以我决定向不同的方向移动,尝试隔离每个文件并单独处理它的上传。到目前为止它似乎正在发挥作用。以下是修订后的代码:

$data['image'] = (isset($_FILES["image"]) && $_FILES["image"]["name"] ? $_FILES["image"]["name"] : NULL);
$data['file'] = (isset($_FILES["file"]) && $_FILES["file"]["name"] ? $_FILES["file"]["name"] : NULL);

$upload = new Zend_File_Transfer();

$files = $upload->getFileInfo();

$options = array('ignoreNoFile' => TRUE);
$upload->setOptions($options);

foreach ($files as $field => $contents)
{
 if(!strlen($contents["name"]))
 {
  continue;
 }

 // upload instructions for image
 if ($field == 'image')
 {
  $upload->addFilter('Rename', array('target' => RESOURCES_IMG . $data['image'], 'overwrite' => TRUE), 'image')
         ->addValidator('ImageSize', false, array('minwidth'  => 100,
                                                  'maxwidth'  => 100,
                                                  'minheight' => 100,
                                                  'maxheight' => 100), 'image')
         ->addValidator('Extension', false, 'jpg', 'image');
 }

 // upload instructions for file
 if ($field == 'file')
 {
  $upload->addFilter('Rename', array('target' => RESOURCES_FILES . $data['file'], 'overwrite' => TRUE), 'file');
 }

 if(!$upload->receive($field)) {
  echo '<h1>Oops</h1><p>Please correct the following errors: <hr /></p>';

  foreach ($upload->getMessages() as $key => $val)
  {
   echo '<p><strong>' . $key . '</strong><br />' . $val . '</p>';
  }
  die;
  //return;
 }
} // foreach

伪解释

我使用getFileInfo()来获取我可用的文件数组,然后循环遍历每个文件。在我的第一个for循环开始时,我检查这个文件是否有名称,如果它没有名称我假设该字段留空并且是NULL所以我告诉循环跳过那个和continue

一旦我进入循环,我只是使用简单的条件将我的上传指令与相应的表单字段匹配。其余的应该是相当不言自明的,如果你进入Zend的东西。

希望这可以帮助处于困境中的其他人。如果您是Zend guru,也许您可​​以评论我的解决方案或修复导致问题的错误。可能有一种更“Zend”的方式,但它现在正在运作,感觉非常好。

参考

为什么我认为它是addFilter()方法的链接,请参阅示例#3(下面)中的注释:

注意:请注意,即使允许多次设置相同的过滤器,但这样做会导致在为同一过滤器使用不同选项时出现问题。

http://framework.zend.com/manual/1.11/en/zend.file.transfer.filters.html

一篇随机的博客文章激励我尝试隔离每个,我称之为“上传指令”,虽然我不确定这是不是所谓的:

http://www.pc-freak.net/blog/tag/uploading-multiple-files-from-a-form-with-zend-framework-zf-storing-uploaded-zf-files-with-unique-name/