【问题标题】:Zend_File_Transfer w/multiple files does not upload equallyZend_File_Transfer w/多个文件上传不均等
【发布时间】:2011-05-19 17:37:15
【问题描述】:

奇怪的标题,是的,但问题很简单;只是加重。我有一个没有使用 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 和 Google 会出现的任何内容进行搜索,但我找不到任何遇到此问题的人。救命!

【问题讨论】:

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


    【解决方案1】:

    好的,所以我进行了更多挖掘,结果发现我链接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 大师,也许您可​​以评论我的解决方案或修复导致问题的错误。可能有一种更“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/

    【讨论】:

    • 谢谢;这对我很有帮助。我对addFilter() 也有同样的问题——以至于我不得不暂时回退到使用setDestination() 直到我弄清楚这一点。此外,这是(令人讨厌的)实际使用setOptions() 的少数示例之一。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多