フォームを使用してサーバーにファイルをアップロードするために、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フォームのいくつかの要素を作成すると、すべてが正常に機能します。