0

使用 Zend_File_Transfer_Adapter_Http 重命名要上传的一系列文件时遇到问题。在代码中的某个时刻,我遇到了一种奇怪的语法。假设您对我尝试上传的多个文件进行了一系列验证。在调用类方法后,我正在使用 foreach 循环遍历文件getFileInfo()。所以基本上我会检查每个文件是否没有通过验证,然后,如果它们通过验证,我正在尝试运行以下代码:

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 上传的文件? 但我不太担心文件被覆盖,因为这是网页的管理部分。如有任何想法,我将不胜感激。

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

4

2 回答 2

1

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

addFilter($filter, $options = null, $files = null):将给定的过滤器添加到过滤器堆栈(可选地仅添加到指定的文件)。$filter 可以是实际的过滤器实例,也可以是指定过滤器类型的短名称(例如,“重命名”)。

我很确定有问题的行应该是:

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

这根据 Zend_Filter_File_Rename 的文档块

   /**
     * 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
     */

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

于 2013-05-04T07:51:05.047 回答
0

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

于 2013-12-12T21:09:12.557 回答