在使用Zend's框架重命名过滤器进行多次上传时,要保持警告


Keep having warnings when using Zend's Framework Rename Filter with multiple uploads

我在使用Zend_File_Transfer_Adapter_Http重命名一系列文件上传时遇到了麻烦。在代码的某个地方,我遇到了一个奇怪的语法。假设您对我试图上传的多个文件进行了一系列验证。在调用类方法getFileInfo()之后,我使用foreach循环迭代文件。所以基本上我做一个检查,看看是否每个文件没有通过验证,然后,如果他们通过验证,我试图运行以下代码:

else {
$reconocido=TRUE;
$sin_espacios=str_replace(' ','_', $nombre_file, $renombrado);
$reconocido=FALSE;
$uploader->addValidator('Extension', FALSE, 'gif, jpg, png, pdf');
if($uploader->isValid($archivo)) {
$reconocido=TRUE;   
} else {
$mime = $uploader->getMimeType($archivo);
$aceptados = array('jpg'=>'image/jpeg', 'png'=>'image/png', 'gif'=>'image/gif',    'pdf'=>'application/pdf');
$clave = array_search($mime, $aceptados);
if(!$clave) {
$messages[]="Tipo de archivo no reconocido.";
} else {
$sin_espacios = "$sin_espacios.$clave";
$reconocido=TRUE;
$renombrado=TRUE;     
}
    }   
if($reconocido) {
$existe = scandir($destino);
if(in_array($sin_espacios, $existe)) {
$punto = strrpos($sin_espacios, '.');
$base = substr($sin_espacios, 0, $punto);
$extension = substr($sin_espacios, $punto);
$i = 1;
do {
$sin_espacios=$base.'_'.$i++.$extension;    
} while (in_array($sin_espacios, $existe));
$renombrado=TRUE;
}
$uploader->clearValidators();   
$uploader->addFilter('Rename', array('target'=>$sin_espacios, $info['tmp_name']));
$exito=$uploader->receive($archivo);

我似乎遇到的问题是在最后一行之前的行,即$uploader->addFilter('Rename', array('target'=>$sin_espacios, $info['tmp_name']));,因为它似乎是一个奇怪的语法(为什么你要在数组中的键值内包含逗号?当它发生时,运行代码确实上传了文件,并正确地重命名了它们,但我一直有以下警告:

Warning: Illegal string offset 'source' in C:'Zend_FW'ZendFramework-1.11.12-minimal'library'Zend'Filter'File'Rename.php on line 145

Warning: Illegal string offset 'target' in C:'Zend_FW'ZendFramework-1.11.12-minimal'library'Zend'Filter'File'Rename.php on line 145还有:File 'C:'Windows'Temp'php97CA.tmp' could not be renamed. It already exists.请原谅我问了一些显而易见的问题。事实是,我所拥有的文档表明,我所说的语法是正确的,但在ZendFramework站点中,我没有找到任何类似的东西。那么正确的语法是什么呢?我也意识到,使用ZendFramework是相当复杂的,也许,对于我目前的水平,但它一直为我工作,直到我尝试做多个上传。我在这里读了一篇关于Zend上传文件的非常详细的解释:PHP:如何重命名与Zend_Form_Element_File上传的文件?但我不太担心文件被覆盖,因为这是网页的管理部分。如有任何建议,我将不胜感激。

为了更准确地说,我怀疑问题是Filter无法识别我试图应用的新名称。我以前使用过重命名过滤器的"目标"选项,没有遇到麻烦,根据手册,它是:目标:新目录,或文件的文件名。我想我做得对。虽然我想知道我是否应该在这里使用文件的完整路径,但我仍然不明白为什么要使用前面提到的语法,但是什么是正确的语法呢?

我怀疑你的直觉是正确的,语法几乎是正确的。addFilter()的api是:

addFilter($filter, $options = null, $files = null):添加给定的筛选到筛选器堆栈(可选地只筛选到指定的文件)。$filter可以是一个实际的过滤器实例,也可以是一个简短的名称指定过滤器类型(例如,'Rename')。

我很确定违规行应该是:

$uploader->addFilter('Rename', array('target'=>$sin_espacios, 'source'=>$info['tmp_name'], 'overwrite' => true));

根据Zend_Filter_File_Rename的docblock

   /**
     * Class constructor
     *
     * Options argument may be either a string, a Zend_Config object, or an array.
     * If an array or Zend_Config object, it accepts the following keys:
     * 'source'    => Source filename or directory which will be renamed
     * 'target'    => Target filename or directory, the new name of the sourcefile
     * 'overwrite' => Shall existing files be overwritten ?
     *
     * @param  string|array $options Target file or directory to be renamed
     * @param  string $target Source filename or directory (deprecated)
     * @param  bool $overwrite Should existing files be overwritten (deprecated)
     * @return void
     */

我希望这将清除警告,我认为它应该。

实际上您的原始语法是正确的,只是您没有将文件名作为必需的参数。省略键作为'source'以及覆盖选项是可以的,您只需要在addFilter中的文件(仅在多文件上传的情况下需要)。