Форма:
//excerpt
$file = new Zend_Form_Element_File('file');
$file->setLabel('File to upload:')
->setRequired(true)
->addValidator('NotEmpty')
->addValidator('Count', false, 1)
->setDestination(APPLICATION_UPLOADS_DIR);
$this->addElement($file);
Контроллер:
//excerpt
if ($form->isValid($request->getPost()) {
$newFilename = 'foobar.txt';
//how should I rename the file?
//When should I rename the file? Before or after receiving?
try {
$form->file->receive();
echo 'filename: '. $form->file->getFileName();
}
}
Вопросы:
-
Когда я вызываю
$form->file->getFileName()
, он возвращает полный путь, а не только имя файла. Как я могу вывести только имя файла?//Answer: First, get an array of the parts of the filename: $pathparts = pathinfo($form->file->getFileName()); //then get the part that you want to use $originalFilename = $pathparts['basename'];
-
Как я могу переименовать имя файла в то, что я хочу? Можно ли это сделать с помощью фильтра
Rename
? Я уже устанавливаю назначение в форме, поэтому все, что я хочу сделать, это изменить имя файла. Может быть, я не должен устанавливать назначение в форме? Или, возможно, это невозможно сделать с фильтром. Может быть, я должен делать это с помощью функции PHP? Что мне делать?//Answer: Use the rename filter: $form->file->addFilter('Rename', 'new-file-name-goes-here.txt');
Окончательное решение:
Вот что я сделал:
public function foobarAction()
{
//...etc...
if (!$form->isValid($request->getPost())) {
$this->view->form = $form;
return;
}
//the following will rename the file (I'm setting the upload dir in the form)
$originalFilename = pathinfo($form->file->getFileName());
$newFilename = 'file-' . uniqid() . '.' . $originalFilename['extension'];
$form->file->addFilter('Rename', $newFilename);
try {
$form->file->receive();
//upload complete!
$file = new Default_Model_File();
$file->setDisplayFilename($originalFilename['basename'])
->setActualFilename($newFilename)
->setMimeType($form->file->getMimeType())
->setDescription($form->description->getValue());
$file->save();
} catch (Exception $e) {
//error: file couldn't be received, or saved (one of the two)
}
}