[v0.3] File Upload Action
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: File Upload Action
Я же сказал что в моем случае в beforeSave уже папка должна быть валидная. У меня в этом событии проверяется есть ли уже файл или нет, и если есть, меняет имя файла.
У нас разная задача, поэтому идеальный вариант, это я пожалуй оставлю как есть пока. Может что-то и придумается.
У нас разная задача, поэтому идеальный вариант, это я пожалуй оставлю как есть пока. Может что-то и придумается.
Жду Yii 3!
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: File Upload Action
Думаю добавлю еще событие onBeforeUpload, в котором можно будет менять путь. Как думаешь это компромисс?
PS: кодеры, использующие действие, присоединяйтесь в обсуждение, а то у нас 1:1
PS: кодеры, использующие действие, присоединяйтесь в обсуждение, а то у нас 1:1
Жду Yii 3!
Re: File Upload Action
Ну хорошо, а почему она там должна быть валидная? Я могу понять, что папка заданная по умолчанию должна быть валидной, но проверка на валидность реально нужна только один раз.
Ведь если папка будет невалидной, то действие выбросит ошибку (и будет exit) и уже в любом случае ничего поделать будет нельзя. Я даже гипотетически не могу представить ситуацию, когда ошибка, прекращающая работу скрипта полностью, будет выкидываться два раза - это невозможно? И всё-таки проверка в принципе должна быть одна на валидность пути, ведь файл один, значит и запись идёт в одно место, выходит и проверка нужна уже для сформированного полностью пути.
И, кстати, если принципиальна проверка на валидность, то тогда нужно отлавливать ошибку и писать её в переменную, чтобы можно было в событии посмотреть валиден ли дефолтный путь или нет.
P.S.:Я думаю, что двух событий более чем достаточно.
Ведь если папка будет невалидной, то действие выбросит ошибку (и будет exit) и уже в любом случае ничего поделать будет нельзя. Я даже гипотетически не могу представить ситуацию, когда ошибка, прекращающая работу скрипта полностью, будет выкидываться два раза - это невозможно? И всё-таки проверка в принципе должна быть одна на валидность пути, ведь файл один, значит и запись идёт в одно место, выходит и проверка нужна уже для сформированного полностью пути.
И, кстати, если принципиальна проверка на валидность, то тогда нужно отлавливать ошибку и писать её в переменную, чтобы можно было в событии посмотреть валиден ли дефолтный путь или нет.
P.S.:Я думаю, что двух событий более чем достаточно.
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: File Upload Action
Я привел реальный пример. Мне в beforeSave нужно проверить нет ли в папке загрузки файла с тем же именем. Следовательно до события уже должна проверится папка, и сгенерироваться имя файла по умолчанию. До а не после, или мне придется в событии проверять папку.serzhiio писал(а):Ну хорошо, а почему она там должна быть валидная?
зачем отлавливать ошибку? если будет ошибка то и действие остановится.serzhiio писал(а):И, кстати, если принципиальна проверка на валидность, то тогда нужно отлавливать ошибку и писать её в переменную, чтобы можно было в событии посмотреть валиден ли дефолтный путь или нет.
И вообще, объясни подробнее зачем менять путь настроенный для действия? Не легче присоединить два действия с разными путями?
Жду Yii 3!
Re: File Upload Action
Мне нужно динамически формировать пути, поэтому статическая настройка не подходит, событие в моём случае идеальный вариант.
Проверку на существование файла в событии я ещё могу понять, но вот это всё равно лишнее в getPath():
Если ты проверяешь существование файла, то проверяй, но если ты создаёшь папку сразу же, выходит что там ничего не может быть изначально.
Это действие нужно выполнять всего один раз, непосредственно перед загрузкой файла, разве не так?
Проверку на существование файла в событии я ещё могу понять, но вот это всё равно лишнее в 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
В getPath() я засунул проверку зря, пытаясь решить твою задачу, уже понял что не получится так. Пока не переделал, т.к. жду может надумаем что-нибудь.serzhiio писал(а):Мне нужно динамически формировать пути, поэтому статическая настройка не подходит, событие в моём случае идеальный вариант.
Проверку на существование файла в событии я ещё могу понять, но вот это всё равно лишнее в getPath()
Если ты проверяешь существование файла, то проверяй, но если ты создаёшь папку сразу же, выходит что там ничего не может быть изначально.
Верно если нет папки то и файла нет, но мне нужно будет проверять наличие папку в событии если не делать этого до.
Да и проверка наличия файла это не единственный случай когда до события папка уже должна быть.
Можешь конкретнее описать как именно динамически создаешь пути, от чего зависит путь? от названия файла?
Жду Yii 3!
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: File Upload Action
Еще ты можешь для формирования динамического пути использовать filenameRule и вообще обойтись без лишнего события в памяти.
Жду Yii 3!
Re: File Upload Action
По поводу проверки наличия - абсолютно с тобой согласен, эта проверка, в принципе, не вредна.
Кстати, наверное это мысль, использовать fileNameRule, но лучше сделать что-то по аналогии с этим, типа pathRule (это кстати реально интересно).
Path у меня формируется следующим образом /root/upload/ + Название модели + / + ID экземпляра + / + картинка.jpg
Кстати, наверное это мысль, использовать fileNameRule, но лучше сделать что-то по аналогии с этим, типа pathRule (это кстати реально интересно).
Path у меня формируется следующим образом /root/upload/ + Название модели + / + ID экземпляра + / + картинка.jpg
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: File Upload Action
Добавлять второй expression мне кажется лишним. Возможно, сделаю по другому, уберу fileNameRule поставлю filePathRule, которое будет объединять путь и имя файла.
Но твою проблему пока не вижу как решить. Потому как в expression не попадает модель, только файл
Но твою проблему пока не вижу как решить. Потому как в expression не попадает модель, только файл
Жду Yii 3!
Re: File Upload Action
Мне кажется, лучше оставить как есть, зачем накручивать filePathRule исходя из только имеющихся данных о файле? Проще задать путь в настройке контроллера в этом случае.
Собственно использование onBeforeSave и есть неплохое решение для меня
Собственно использование onBeforeSave и есть неплохое решение для меня
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: File Upload Action
Это не накрутка Просто уже вернул все назад, убрал getPath(), и тогда в beforeSave уже нельзя менять путь, а твоя задача показала что такая необходимость нужна будет рано или поздно.
Жду Yii 3!
Re: File Upload Action
Мне пришлось немного видоизменить твоё действие, в отношении переменной $_path, по-моему, я поменял всё на $this->path и после этого смог оперировать уже $event->sender->path.
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: File Upload Action
Расширение обновлено. Изменения:
Добавлены два события: onBeforeUpload и onAfterUpload, детальнее читайте readme_ru.txt
Событие onBeforeSave теперь может отменить сохранение файла.
Добавлены методы для работы с ошибками.
Добавлены два события: onBeforeUpload и onAfterUpload, детальнее читайте readme_ru.txt
Событие onBeforeSave теперь может отменить сохранение файла.
Добавлены методы для работы с ошибками.
Жду Yii 3!
Re: [v0.3] File Upload Action
Сижу уже несколько часов, никак не получается сделать эту загрузку файлов в uploadify.
Делаю так.
1) в _form.php подкючаю виджет:
Обычный инпут заменился на кнопку.
2) В контроллере SiteController.php пишу:
3) Модель UploadifyFile.php такая:
4) В папке /extensions/uploadify/ лежат файлы: EFileUploadAction.php, EUploadifyWidget.php, папка assets
Подскажите, пож-та, что не так. При загрузке выдается ошибка 500 (Http-error).
Просмотрел все темы, что здесь. Запутался..
Делаю так.
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;
},
),
);
}
Код: Выделить всё
class UploadifyFile extends CFormModel {
public $uploadifyFile;
public function rules() {
return array(
array('uploadifyFile', 'file',
'maxSize' => 1024*1024*1024,
'types' => 'jpg, png, gif, txt'),
);
}
}
Подскажите, пож-та, что не так. При загрузке выдается ошибка 500 (Http-error).
Просмотрел все темы, что здесь. Запутался..
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: [v0.3] File Upload Action
'class'=>'ext.uploadify.SwfUploadAction' - это что за класс?
Жду Yii 3!
Re: [v0.3] File Upload Action
Сорри, это с предыдущих попыток. На самом деле там у меняmc-bear писал(а):'class'=>'ext.uploadify.SwfUploadAction' - это что за класс?
'class'=>'ext.uploadify.EFileUploadAction',
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: [v0.3] File Upload Action
Хорошо теперь дальше, ты в ивджете используешь
name=''
что означает что строишь форму не из модели, а просто отдельный input
действие же привязываешь к модели, действие ищет поле с файлом 'UploadifyFile[UploadifyFile]' (обрати внимание на разный регистр в свойстве модели) а это поля нет, есть просто 'uploadifyFile'
name=''
что означает что строишь форму не из модели, а просто отдельный input
действие же привязываешь к модели, действие ищет поле с файлом 'UploadifyFile[UploadifyFile]' (обрати внимание на разный регистр в свойстве модели) а это поля нет, есть просто 'uploadifyFile'
Жду Yii 3!
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: [v0.3] File Upload Action
попробуй так
Код: Выделить всё
$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!
Re: [v0.3] File Upload Action
Про инпут теперь понял, спасибо.
Сделал через модель вот так:
Когда писал просто 'model'=>'UploadifyFile', выдавал ошибку. Потому сделал new *.
Теперь у инпута name UploadifyFile[uploadifyFile].
Изменил actions в контроллере (').
Но все-равно выдается ошибка 500 при загрузке фотографии. Теперь что не так может быть.. Папка files в корьне есть. Права нормальные у нее.
Сделал через модель вот так:
Код: Выделить всё
$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);}'
),
));
Теперь у инпута name UploadifyFile[uploadifyFile].
Изменил actions в контроллере ('
Код: Выделить всё
model'=>'UploadifyFile',
'attribute'=>'uploadifyFile',
Но все-равно выдается ошибка 500 при загрузке фотографии. Теперь что не так может быть.. Папка files в корьне есть. Права нормальные у нее.
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: [v0.3] File Upload Action
Включи лог и посмотри что пишет. Предположу что настроен accessControl или CSFR-валидация?
Жду Yii 3!