[v0.3] File Upload Action

Выкладываем свои наработки
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

Я же сказал что в моем случае в beforeSave уже папка должна быть валидная. У меня в этом событии проверяется есть ли уже файл или нет, и если есть, меняет имя файла.
У нас разная задача, поэтому идеальный вариант, это я пожалуй оставлю как есть пока. Может что-то и придумается.
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

Думаю добавлю еще событие onBeforeUpload, в котором можно будет менять путь. Как думаешь это компромисс?
PS: кодеры, использующие действие, присоединяйтесь в обсуждение, а то у нас 1:1 :)
Жду Yii 3!
serzhiio
Сообщения: 60
Зарегистрирован: 2011.01.30, 14:09

Re: File Upload Action

Сообщение serzhiio »

Ну хорошо, а почему она там должна быть валидная? Я могу понять, что папка заданная по умолчанию должна быть валидной, но проверка на валидность реально нужна только один раз.
Ведь если папка будет невалидной, то действие выбросит ошибку (и будет exit) и уже в любом случае ничего поделать будет нельзя. Я даже гипотетически не могу представить ситуацию, когда ошибка, прекращающая работу скрипта полностью, будет выкидываться два раза - это невозможно? И всё-таки проверка в принципе должна быть одна на валидность пути, ведь файл один, значит и запись идёт в одно место, выходит и проверка нужна уже для сформированного полностью пути.

И, кстати, если принципиальна проверка на валидность, то тогда нужно отлавливать ошибку и писать её в переменную, чтобы можно было в событии посмотреть валиден ли дефолтный путь или нет.

P.S.:Я думаю, что двух событий более чем достаточно.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

serzhiio писал(а):Ну хорошо, а почему она там должна быть валидная?
Я привел реальный пример. Мне в beforeSave нужно проверить нет ли в папке загрузки файла с тем же именем. Следовательно до события уже должна проверится папка, и сгенерироваться имя файла по умолчанию. До а не после, или мне придется в событии проверять папку.
serzhiio писал(а):И, кстати, если принципиальна проверка на валидность, то тогда нужно отлавливать ошибку и писать её в переменную, чтобы можно было в событии посмотреть валиден ли дефолтный путь или нет.
зачем отлавливать ошибку? если будет ошибка то и действие остановится.

И вообще, объясни подробнее зачем менять путь настроенный для действия? Не легче присоединить два действия с разными путями?
Жду Yii 3!
serzhiio
Сообщения: 60
Зарегистрирован: 2011.01.30, 14:09

Re: File Upload Action

Сообщение serzhiio »

Мне нужно динамически формировать пути, поэтому статическая настройка не подходит, событие в моём случае идеальный вариант.
Проверку на существование файла в событии я ещё могу понять, но вот это всё равно лишнее в getPath():

Код: Выделить всё

                        if($this->createDirectory===true)
                        {
                                if(!mkdir($this->_path,$this->createDirectoryMode,$this->createDirectoryRecursive))
                                        throw new CException(Yii::t('yiiext','Cannot create directory "{dir}".',array('{dir}'=>$this->_path)));
                                Yii::trace('Create directory "{dir}"',array('{dir}'=>$this->_path));
                        }
 
Если ты проверяешь существование файла, то проверяй, но если ты создаёшь папку сразу же, выходит что там ничего не может быть изначально.
Это действие нужно выполнять всего один раз, непосредственно перед загрузкой файла, разве не так?
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

serzhiio писал(а):Мне нужно динамически формировать пути, поэтому статическая настройка не подходит, событие в моём случае идеальный вариант.
Проверку на существование файла в событии я ещё могу понять, но вот это всё равно лишнее в getPath()
Если ты проверяешь существование файла, то проверяй, но если ты создаёшь папку сразу же, выходит что там ничего не может быть изначально.
В getPath() я засунул проверку зря, пытаясь решить твою задачу, уже понял что не получится так. Пока не переделал, т.к. жду может надумаем что-нибудь.
Верно если нет папки то и файла нет, но мне нужно будет проверять наличие папку в событии если не делать этого до.
Да и проверка наличия файла это не единственный случай когда до события папка уже должна быть.
Можешь конкретнее описать как именно динамически создаешь пути, от чего зависит путь? от названия файла?
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

Еще ты можешь для формирования динамического пути использовать filenameRule и вообще обойтись без лишнего события в памяти.
Жду Yii 3!
serzhiio
Сообщения: 60
Зарегистрирован: 2011.01.30, 14:09

Re: File Upload Action

Сообщение serzhiio »

По поводу проверки наличия - абсолютно с тобой согласен, эта проверка, в принципе, не вредна.
Кстати, наверное это мысль, использовать fileNameRule, но лучше сделать что-то по аналогии с этим, типа pathRule (это кстати реально интересно).
Path у меня формируется следующим образом /root/upload/ + Название модели + / + ID экземпляра + / + картинка.jpg
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

Добавлять второй expression мне кажется лишним. Возможно, сделаю по другому, уберу fileNameRule поставлю filePathRule, которое будет объединять путь и имя файла.
Но твою проблему пока не вижу как решить. Потому как в expression не попадает модель, только файл :(
Жду Yii 3!
serzhiio
Сообщения: 60
Зарегистрирован: 2011.01.30, 14:09

Re: File Upload Action

Сообщение serzhiio »

Мне кажется, лучше оставить как есть, зачем накручивать filePathRule исходя из только имеющихся данных о файле? Проще задать путь в настройке контроллера в этом случае.
Собственно использование onBeforeSave и есть неплохое решение для меня :)
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

Это не накрутка :) Просто уже вернул все назад, убрал getPath(), и тогда в beforeSave уже нельзя менять путь, а твоя задача показала что такая необходимость нужна будет рано или поздно.
Жду Yii 3!
serzhiio
Сообщения: 60
Зарегистрирован: 2011.01.30, 14:09

Re: File Upload Action

Сообщение serzhiio »

Мне пришлось немного видоизменить твоё действие, в отношении переменной $_path, по-моему, я поменял всё на $this->path и после этого смог оперировать уже $event->sender->path.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: File Upload Action

Сообщение slavcodev »

Расширение обновлено. Изменения:
Добавлены два события: onBeforeUpload и onAfterUpload, детальнее читайте readme_ru.txt
Событие onBeforeSave теперь может отменить сохранение файла.
Добавлены методы для работы с ошибками.
Жду Yii 3!
Аватара пользователя
Groonel
Сообщения: 10
Зарегистрирован: 2011.03.18, 15:58

Re: [v0.3] File Upload Action

Сообщение Groonel »

Сижу уже несколько часов, никак не получается сделать эту загрузку файлов в uploadify.

Делаю так.
1) в _form.php подкючаю виджет:

Код: Выделить всё

$this->widget('ext.uploadify.EUploadifyWidget', array(
    'name'=>'uploadifyFile',
    'sessionParam'=>'PHP_SESSION_ID',
    'options'=>array(
        'fileExt'=>'*.jpg;*.png;*.gif',
        'script'=>$this->createUrl('/site/uploadify'),
        'auto'=>true,
        'buttonText'=>'upload',
        'onComplete'=>'js:function(event,id,fileObj,response,data){alert(response)}',
        'onError'=>'js:function(event,ID,fileObj,errorObj){alert(errorObj.info);}'
    ),
));
    <input type="file" name="uploadifyFile"/>
 
Обычный инпут заменился на кнопку.

2) В контроллере SiteController.php пишу:

Код: Выделить всё

public function actions()
    {
        return array(
      'uploadify'=>array(
          'class'=>'ext.uploadify.SwfUploadAction',   
          'model'=>'UploadifyFile',
        'attribute'=>'UploadifyFile',
        'path'=>Yii::getPathOfAlias('webroot').'/files/'.Yii::app()->getController()->getId().'/'.date('Y-m-d'),
        'createDirectory'=>true,
        'filenameRule'=>'md5($file->name).".".$file->extensionName',
        'onAfterSave'=>function($event)
        {
            echo $event->sender->path.'/'.$event->sender->filename;
            exit;
        },
        ),
        );
    } 
3) Модель UploadifyFile.php такая:

Код: Выделить всё

class UploadifyFile extends CFormModel {
    public $uploadifyFile;
    public function rules() {
        return array(
            array('uploadifyFile', 'file',
                'maxSize' => 1024*1024*1024,
                'types' => 'jpg, png, gif, txt'),
        );
    }
} 
4) В папке /extensions/uploadify/ лежат файлы: EFileUploadAction.php, EUploadifyWidget.php, папка assets

Подскажите, пож-та, что не так. При загрузке выдается ошибка 500 (Http-error).
Просмотрел все темы, что здесь. Запутался.. :?
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: [v0.3] File Upload Action

Сообщение slavcodev »

'class'=>'ext.uploadify.SwfUploadAction' - это что за класс?
Жду Yii 3!
Аватара пользователя
Groonel
Сообщения: 10
Зарегистрирован: 2011.03.18, 15:58

Re: [v0.3] File Upload Action

Сообщение Groonel »

mc-bear писал(а):'class'=>'ext.uploadify.SwfUploadAction' - это что за класс?
Сорри, это с предыдущих попыток. На самом деле там у меня
'class'=>'ext.uploadify.EFileUploadAction',
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: [v0.3] File Upload Action

Сообщение slavcodev »

Хорошо теперь дальше, ты в ивджете используешь
name=''
что означает что строишь форму не из модели, а просто отдельный input
действие же привязываешь к модели, действие ищет поле с файлом 'UploadifyFile[UploadifyFile]' (обрати внимание на разный регистр в свойстве модели) а это поля нет, есть просто 'uploadifyFile'
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: [v0.3] File Upload Action

Сообщение slavcodev »

попробуй так

Код: Выделить всё

$this->widget('ext.uploadify.EUploadifyWidget', array(
    'model'=>'UploadifyFile',
    'attribute'=>'uploadifyFile', 

Код: Выделить всё

public function actions()
    {
        return array(
      'uploadify'=>array(
          'class'=>'ext.uploadify.EFileUploadAction',   
          'model'=>'UploadifyFile',
        'attribute'=>'uploadifyFile', 
Жду Yii 3!
Аватара пользователя
Groonel
Сообщения: 10
Зарегистрирован: 2011.03.18, 15:58

Re: [v0.3] File Upload Action

Сообщение Groonel »

Про инпут теперь понял, спасибо.
Сделал через модель вот так:

Код: Выделить всё

$this->widget('ext.uploadify.EUploadifyWidget', array(
    'model'=>new UploadifyFile,
        'attribute'=>'uploadifyFile',
    'sessionParam'=>'PHP_SESSION_ID',
    'options'=>array(
        'fileExt'=>'*.jpg;*.png;*.gif',
        'script'=>$this->createUrl('/site/uploadify'),
        'auto'=>true,
        'buttonText'=>'upload',
        'onComplete'=>'js:function(event,id,fileObj,response,data){alert(response)}',
        'onError'=>'js:function(event,ID,fileObj,errorObj){alert(errorObj.info);}'
    ),
)); 
Когда писал просто 'model'=>'UploadifyFile', выдавал ошибку. Потому сделал new *.
Теперь у инпута name UploadifyFile[uploadifyFile].

Изменил actions в контроллере ('

Код: Выделить всё

model'=>'UploadifyFile',
        'attribute'=>'uploadifyFile',
).

Но все-равно выдается ошибка 500 при загрузке фотографии. Теперь что не так может быть.. Папка files в корьне есть. Права нормальные у нее.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: [v0.3] File Upload Action

Сообщение slavcodev »

Включи лог и посмотри что пишет. Предположу что настроен accessControl или CSFR-валидация?
Жду Yii 3!
Ответить