3

奇怪的标题,是的,但问题很简单;只是加重。我有一个没有使用 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() 分段,在这种情况下只影响它们的相关文件“图像”或“文件” - 表单字段的名称。

“文件”上传始终有效!但是,“图像”上传不会,而且它会将临时文件放入 RESOURCES_FILES 目录中,这根本没有意义。因此,该目录除了 php8TJT13、phpXmOzQM 等文件之外还有 PDF 和其他任何内容。

我一直在盯着这段代码,搜索 Stack Overflow 和任何谷歌会出现的东西,我找不到任何有这个问题的人。帮助!

4

1 回答 1

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所以我告诉循环跳过那个 and continue

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

希望这可以帮助处于我困境中的其他人。如果您是 Zend 大师,也许您可​​以评论我的解决方案或修复导致问题的错误。可能有一种更“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/

于 2011-05-20T03:49:35.610 回答