Zend Zend_File_Transfer_Adapter_Http переименование вопроса - PullRequest
5 голосов
/ 19 декабря 2008

У меня есть вопрос о переименовании файла после его загрузки в Zend. Я не знаю, где поставить фильтр переименования. Вот что у меня есть. Я пытался переместить вещи, но я потерян. В настоящее время он загружает файл в папку с моими фотографиями, но не переименовывает его. Спасибо за любую помощь!

if($this->_request->isPost()) 
{
    $formData = $this->_request->getPost();

    if ($form->isValid($formData)) 
    {
        $adapter = new Zend_File_Transfer_Adapter_Http();
        $adapter->setDestination(WWW_ROOT . '/photos');

        $photo = $adapter->getFileInfo('Photo');

        $adapter->addFilter('Rename', array(
            $photo['Photo']['tmp_name'], 
            WWW_ROOT . '/photos/' . $this->memberId . '.jpg', 
            true
        )); 

        if ($adapter->receive()) 
        {
            echo 'renamed';
        }
    }
}

Ответы [ 6 ]

9 голосов
/ 29 октября 2009

На самом деле, есть еще более простой способ сделать это. Все, что вам нужно сделать, это передать false как второй параметр для метода getFileName объекта Zend_File_Transfer_Adapter_Http. Затем вы можете переименовать файл, добавив к нему идентификатор пользователя или проанализировать имя файла, чтобы получить расширение, если хотите.

// upload a file called myimage.jpg from the formfield named "image".

$uploaded_file = new Zend_File_Transfer_Adapter_Http();
$uploaded_file->setDestination('/your/path/');
    try {
        // upload the file
        $uploaded_file->receive();
    } catch (Zend_File_Transfer_Exception $e) {
        $e->getMessage();
    }
$file_name = $uploaded_file->getFileName('image', false);
// this outputs "myimage.jpg"

$file_path = $uploaded_file->getFileName('image');
// this outputs "/your/path/myimage.jpg"

// now use the above information to rename the file
6 голосов
/ 18 февраля 2009

Мне удалось сделать это, установив фильтр. Обратите внимание, что я не указал путь назначения.

$adapter= new Zend_File_Transfer_Adapter_Http();
$adapter->addFilter('Rename',array('target' => WWW_ROOT . '/photos/' . $this->memberId . '.jpg'));

$adapter->receive();
1 голос
/ 23 апреля 2010
public function getExtension($name){
    $names= explode(".", $name);
    return $names[count($names)-1];
}
1 голос
/ 24 марта 2009

есть лучший и более безопасный способ с Zend Framework ...

создать вспомогательный класс для получения расширения файла. .

class ImageUpload {

public function getExtension ($name)
{
    if($name){
    foreach ($name as $val){
        $fname=$val['name'];
      }
    $exts = split("[/\\.]", $fname) ;
    $n = count($exts)-1;
    $exts = $exts[$n];
    return $exts; 
    }

}

}

в контроллере:

Класс ProfileController расширяет Zend_Controller_Action { функция indexAction () { $ this-> view-> title = "Профиль"; $ this-> view-> bodyCopy = "

Пожалуйста, заполните эту форму.

";
    $form = new ImgForm();

    if ($this->_request->isPost()) {
        $formData = $this->_request->getPost();
        if ($form->isValid($formData)) {
                $adapter = new Zend_File_Transfer_Adapter_Http();
                $adapter->setDestination('images/users/big');

                // getting extension

                $filename = $adapter->getFileInfo();
                $uhelper = new ImageUpload;  // cals for help to get file extension
                $extension = $uhelper->getExtension($filename); // got extension   


                 // success -- file handled

                 //rename
                 $auth = Zend_Auth::getInstance();
                 $identity = $auth->getIdentity();

                 $adapter->addFilter('Rename', array('target' => 'images/users/big/'.$identity->id.'.'.$extension,
                     'overwrite' => true));

                if (!$adapter->receive()) {
                 $form->addError($adapter->getMessages());

                }

        } else {
            $form->populate($formData);
        }
    }

    $this->view->form = $form;

}

когда ваша форма должна быть:

    parent::__construct($options);
    $this->setName('upload');
    $this->setAttrib('enctype', 'multipart/form-data');


    $file = new Zend_Form_Element_File('file');
    $file->setLabel('File')
          ->addValidator('Count', false, 1)     // ensure only 1 file
          ->addValidator('Size', false, 102400) // limit to 100K
          ->addValidator('Extension' ,false, 'jpg,png,gif') // only JPEG, PNG, and GIFs

          ->setRequired(true);          


    $submit = new Zend_Form_Element_Submit('submit');
    $submit->setLabel('Upload');

    $this->addElements(array($file, $submit));

}
* *} Тысяча двадцать-один

Веселитесь

1 голос
/ 16 января 2009

Согласно документации, вы не должны указывать путь в пункте назначения

текст ссылки

0 голосов
/ 04 февраля 2009

Мне пришлось перехватить $ _FILES и внести изменения, прежде чем сделать вызов адаптеру

if(isset($_FILES['file1'])){
  $ext = pathinfo($_FILES['file1']['name']);
  $_FILES['file1']['name'] = 'image_'. $userid .'.'.$ext['extension'];
}
$adapter = new Zend_File_Transfer_Adapter_Http();

Я уверен, что есть лучший способ, и я не знаю, почему фильтр не работает, я перепробовал все, чтобы заставить его работать. У меня был крайний срок, и поэтому вышеприведенный код пошел в производство LOL

Надеюсь, это кому-нибудь поможет

Eric

...