奇怪的标题,是的,但问题很简单;只是加重。我有一个表单,我没有使用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会出现什么,我找不到有人遇到这个问题。救命啊!
答案 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
一篇随机的博客文章激励我尝试隔离每个,我称之为“上传指令”,虽然我不确定这是不是所谓的: