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 でアップロードされたファイルの名前を変更する方法? しかし、これは Web ページの管理セクションであるため、ファイルが上書きされる心配はあまりありません。どんなアイデアにも感謝します。

より正確に言うと、適用しようとしている新しい名前をフィルターが認識できないことが問題であると思われます。Rename フィルタの 'target' オプションを問題なく使用したことがあります。マニュアルによると、次のとおりです。 target: 新しいディレクトリ、またはファイルのファイル名。私はそれを正しくやっていると思います。ここでファイルへの完全なパスを使用する必要があるかどうかは疑問ですが、前に述べた構文を使用する必要がある理由はまだわかりませんが、正しい構文は何ですか?

4

2 に答える 2

1

あなたの本能は正しく、構文はほぼ正しいと思います。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
     */

これで警告がクリアされることを願っています。そうすべきだと思います。

于 2013-05-04T07:51:05.047 に答える
0

実際には、必要なパラメーターとしてファイル名を見逃したことを除いて、元の構文は正しかったです。「ソース」および上書きオプションとしてキーを省略しても問題ありません。必要なのは addFilter 内のファイルだけです (複数ファイルのアップロードの場合にのみ必要)。

于 2013-12-12T21:09:12.557 に答える