ファイルをダウンロードして名前を変更する

この記事は、Zend Frameworkのアーキテクチャに少なくとも少し精通している人向けに書かれています。 興味のある方は、別の記事でフォームの操作について詳しく説明します。



フォームを使用してサーバーにファイルをアップロードするために、Zend FrameworkフォームにはZend_Form_Element_File要素があります。 名前変更フィルターがあり、ダウンロードしたファイルの名前を変更できます。 ただし、マイナスがあります。ファイルの拡張子を保持するために、ファイルの新しい名前を指定することはできません。 どうやってやるの? しかし、setMultiFileを使用するとどうなりますか?







たとえば、次のフォームがあります



class Form_Myform extends Zend_Form

{

public function __construct($options = null )

{

parent::__construct($options);



$ this ->setAttrib( 'enctype' , 'multipart/form-data' );



$image = new Zend_Form_Element_File( 'image' );

$image->setLabel( 'Image:' )

->addValidator( 'Size' , false , 1024000)

->addValidator( 'Extension' , false , 'jpg,png,gif' );



$submit = new Zend_Form_Element_Submit( 'go' );

$submit->setLabel( 'Submit' );



$elements = array($image, $submit);

$ this ->addElements($elements);

}




* This source code was highlighted with Source Code Highlighter .








addValidator( 'Size'、false、1024000) -最大サイズを設定します(1000kB)



addValidator( 'Extension'、false、 'jpg、png、gif') -有効な拡張子を指定します



Renameフィルターを使用するため、setDestinationを特に指定しません。



これでフォームが完成し、ファイルを受け入れます。 コントローラに登り、次のように書きます



$request = $ this ->getRequest();

$form = new Form_Myform();

if ($request->isPost()) {

if ( $form->isValid( $request->getPost() ) ) {

$file = $form->image->getFileInfo();

$ext = split( "[/\\.]" , $file[ 'image' ][ 'name' ]);

$newName = 'newname.' .$ext[count($ext)-1];



$form->image->addFilter( 'Rename' , realpath(dirname( '.' )).

DIRECTORY_SEPARATOR.

'upload' .

DIRECTORY_SEPARATOR.

$newName);



$form->image->receive();

}

}




* This source code was highlighted with Source Code Highlighter .








$ file = $ form-> image-> getFileInfo() -アップロードされたファイル画像に関する情報を取得



$ ext = split( "[/ \\。]"、$ file ['image'] ['name']) -ファイル名から拡張子を切り取ります



$ newName = 'newname。'。$ ext-古い拡張子で新しい名前を設定します(名前は必要に応じてランダムに生成できます)



$ form-> image-> addFilter( 'Rename' ... ...イメージフォーム要素に「Rename」フィルタを追加します。ここで、新しい名前+サーバー上のファイルへのフルパスを渡します



$ form-> image-> receive() -ファイルを一時フォルダーからフォルダーに転送します。 自動的に適用されるフィルター



Zend_Form_Element_FileにはsetMultiFile()メソッドもあり、1つのフォーム要素で複数のファイルを一度に送信できます。 例:



$image = new Zend_Form_Element_File( 'image' );

$image->setLabel( 'Image:' )

->addValidator( 'Size' , false , 1024000)

->addValidator( 'Extension' , false , 'jpg,png,gif' )

->setMultiFile(3);




* This source code was highlighted with Source Code Highlighter .








この場合、すべてのフィルターとバリデーターがすべてのファイルに一度に適用されます。 「Count」バリデーターを使用して、ダウンロードするファイルの最小数と最大数を指定することもできます



->addValidator( 'Count' , false , array( 'min' => 1, 'max' => 3))







しかし、1つの大きな「しかし」があります。 名前変更フィルターは、すべてのファイルの名前を1つに変更します。 この状況になるには? 抜け道があります。 コントローラーに戻ります。



$request = $ this ->getRequest();

$form = new Form_Myform();

if ($request->isPost()) {

if ( $form->isValid( $request->getPost() ) ) {

$adapter = $form->image->getTransferAdapter();

$i = 0;

foreach ($adapter->getFileInfo() as $file) {

$ext = split( "[/\\.]" , $file[ 'name' ]);

$newName = 'newname' .$i. '.' .$ext[count($ext)-1];

$adapter->addFilter( 'Rename' , realpath(dirname( '.' )).

DIRECTORY_SEPARATOR.

'upload' .

DIRECTORY_SEPARATOR.

$newName);

$adapter->receive($file[ 'name' ]);

$i++;

}

}

}




* This source code was highlighted with Source Code Highlighter .








この場合、File_Transfer_Adapterとそのreceive()メソッドを直接使用します。 ただし、「Count」バリデーターは忘れてください。 間違った数のファイルを読み取ります。 また、エラーはすべてのファイルであっても、1つのファイルについてのみ表示されます。



setMultiFile()を使用せずにできる場合は、使用しないことをお勧めします。 Fileフォームのいくつかの要素を作成すると、すべてが正常に機能します。



All Articles