Segue o exemplo de utilização Ricardo…
Não postei antes porque não estava com o código de exemplo na hora…
O tenso, é que como eu disse, adaptei a extensão para o meu caso, internacionalizei ela, mexi em CSS e fiz algumas outras modificações menores para facilitar a exibição na tela, pois a extensão acaba não ajudando muito nisso.
Se você não precisar trabalhar com upload via "ajax", não sugiro que use a extensão EAjaxUpload, neste caso a sugestão do KillCloud pode ser a melhor opção, porém se for, sugiro que use-a.
Por experiência própria ela dá um trabalho para se mexer, porém depois que se entende como ela funciona, fica tranquilo modificá-la e achei ela altamente customizável.
Antes dos exemplos, HApp é um Helper que eu criei para o projeto… Ele possui algumas funções "Utils".
Segue as principais funções que uso no código abaixo:
// Internacionalização
public static function t($key, $category = 'app')
{
return Yii::t($category, $key);
}
// Exceções
public static function throwException($status, $message = null, $errorCode = 0)
{
if (is_null($message)) {
$message = HApp::getMessageStatus($status);
} else {
$errorCode = -1;
}
if ($message) {
throw new CHttpException($status, $message, $errorCode);
}
HApp::throwException(500);
}
Código da View
<div class="input-block">
<?php if (!preg_match('/MSIE/i', Yii::app()->request->userAgent)): ?>
<?= $form->labelEx($model, 'image_path') ?>
<div class="ajaxUpload">
<?php
$this->widget('ext.EAjaxUpload.EAjaxUpload', array(
'id' => 'publicationAjaxUpload',
'config' => array(
'action' => Yii::app()->createAbsoluteUrl('ajax/uploadFile'),
'allowedExtensions' => explode(', ', $model->annexExtensions),
'sizeLimit' => $model->maxSizeAnnex,
'minSizeLimit' => $model->minSizeAnnex,
'messages' => array(
'sizeError' => HApp::t('eauSizeError'),
'minSizeError' => HApp::t('eauMinSizeError'),
'onLeave' => HApp::t('eauOnLeave'),
'typeError' => HApp::t('eauTypeError'),
'emptyError' => HApp::t('eauEmptyError'),
),
'onComplete' => 'js:function(id, fileName, responseJSON) {
if(responseJSON["success"] === true) {
clearErrorsMesages();
$(".qq-upload-button").hide();
$(".qq-upload-status").last().append("<a href=\'#\' class=\'qq-upload-remove\'>' . HApp::t('remove') . '</a>");
$(".qq-upload-remove").last().bind("click", function() {
statusItem = $(this).parent();
$.ajax(
{
url:"' . Yii::app()->createAbsoluteUrl('ajax/deleteFile') . '",
type:"POST",
cache:false,
dataType:"html",
data:{fileName:fileName},
success:function(response) {
statusItem.fadeOut(1500, function() {
$(this).remove();
$(".qq-upload-button").fadeIn();
});
},
error:function(error, b, c, d, e) {
setAlertMessage(error.responseText, "warning", "qq-upload-message");
if(error.status === 404) {
statusItem.fadeOut(1500, function() {
$(this).remove();
});
}
}
});
});
}
}',
'showMessage' => 'js:function(message) {
clearErrorsMesages();
setAlertMessage(message, "warning", "qq-upload-message");
}',
),
));
?>
</div>
<?= $form->hiddenField($model, 'image_path') ?>
<?= $form->error($model, 'image_path') ?>
<?php endif; ?>
</div>
Função setAlertMessage
function setAlertMessage(text, type, idDiv, fadeOutOff) {
$('div#' + idDiv).fadeOut(typeof fadeOutOff === 'undefined' ? 750 : 0, function() {
$(this).html("<p class='alert-" + type + "'>" + text + "</p>").fadeIn(750);
});
}
AjaxController
<?php
Yii::import('application.components.Controller');
class AjaxController extends Controller
{
public function filters()
{
return array(
'postOnly + deleteFile, uploadFile',
);
}
public function actions()
{
return array(
// Ações da Aplicação
'deleteFile' => 'application.controllers.ajax.DeleteFileAction',
'loadView' => 'application.controllers.ajax.LoadViewAction',
'uploadFile' => 'application.controllers.ajax.UploadFileAction',
);
}
}
UploadFileAction
<?php
Yii::import("ext.EAjaxUpload.qqFileUploader");
class UploadFileAction extends CAction
{
private $_ajaxUploadPath;
function __construct()
{
$this->_init();
}
private function _init()
{
$this->_ajaxUploadPath = Yii::app()->basePath . '/../resources/ajaxUploads/' . Yii::app()->session->sessionID . '/';
if (is_dir($this->_ajaxUploadPath) && scandir($this->_ajaxUploadPath) > 2) {
$openPath = opendir($this->_ajaxUploadPath);
while ($fileName = readdir($openPath)) {
if (is_file($this->_ajaxUploadPath . $fileName)) {
unlink($this->_ajaxUploadPath . $fileName);
}
}
rmdir($this->_ajaxUploadPath);
}
if (!is_dir($this->_ajaxUploadPath)) {
mkdir($this->_ajaxUploadPath);
}
}
public function run()
{
if (Yii::app()->request->isPostRequest && Yii::app()->request->isAjaxRequest) {
$ajaxUpload = new qqFileUploader(Yii::app()->params['allowedExtensions'], Yii::app()->params['maxSizeUpload']);
HApp::ajaxResponse($ajaxUpload->handleUpload($this->_ajaxUploadPath, true));
}
HApp::throwException(400);
}
}
DeleteFileAction
<?php
class DeleteFileAction extends CAction
{
private $_ajaxUploadPath;
function __construct()
{
$this->_init();
}
private function _init()
{
$this->_ajaxUploadPath = Yii::app()->basePath . '/../resources/ajaxUploads/' . Yii::app()->session->sessionID . '/';
}
public function run()
{
if (Yii::app()->request->isPostRequest && Yii::app()->request->isAjaxRequest) {
$fileName = HApp::getRequest('POST', 'fileName');
if (!empty($fileName) && is_dir($this->_ajaxUploadPath)) {
if (is_file($this->_ajaxUploadPath . $fileName)) {
if (unlink($this->_ajaxUploadPath . $fileName)) {
HApp::ajaxResponse(Yii::t('app', "O arquivo <strong>{file}</strong> foi deletado com sucesso!", array('{file}' => $fileName)));
}
HApp::throwException(500, Yii::t('app', 'Não foi possível deletar o arquivo <strong>{file}</strong>. Tente novamente.', array('{file}' => $fileName)));
}
HApp::throwException(404, Yii::t('app', 'O arquivo <strong>{file}</strong> não foi encontrado.', array('{file}' => $fileName)));
}
HApp::throwException(403);
}
HApp::throwException(400);
}
}
Atenção: No meu caso, só havia sentido o usuário enviar um arquivo por vez, por isso, existem alguns tratamentos no código para impedir que fossem enviados mais de um arquivo por vez.