Yii Framework Forum: Trabalhando Com Upload De Imagens - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Trabalhando Com Upload De Imagens Trabalhando com upload de imagens Rate Topic: -----

#1 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 07 February 2013 - 06:02 AM

Olá pessoal, estou precisando de mais uma ajuda. Já fiz várias pesquisas e ainda não consegui resolver. Preciso de alguma extensão para fazer upload de imagens para uma pasta no servidor. Não sei se é o melhor, mas estou tentando usar o uploadify. Mas, quando seleciono a imagem e tento enviar, aparece o erro "could not find upload script", ou seja, não encontra o script e depois da erro #2038. Já tentei de tudo e o erro persiste. Abaixo os códigos.

_form
<?php $this->widget('application.extensions.uploadify.uploadifyWidget', array('mult'=>'false')); ?>
                <div id="fileUpload">Erro no Javascript. Contatar desenvolvedor!</div>
                <div class='photo_menu'>
                    <a href="javascript:startUpload()">Enviar</a> |  <a href="javascript:$('#fileUpload').fileUploadClearQueue()">Limpar</a>
                </div>


_VeiculoController
public function actionUploads() {
            return array(
                'upload'=>'application.controllers.upload.UploadFileAction',
            );
        }


arquivo uploadifywidget
<script type="text/javascript" src="<?php echo Yii::app()->baseUrl; ?>/js/jquery-1.7.1.js"></script>
<script type="text/javascript" src="<?php echo Yii::app()->baseUrl; ?>/js/jquery.uploadify.js"></script>
<script type="text/javascript">
$(document).ready(function() {
    $("#fileUpload").fileUpload({
        'uploader': '../images/uploader.swf',
        'cancelImg': '../images/cancel.png',
        'script': 'veiculo/uploads',
        'folder': '../images/gallery',
        'fileDesc': 'Image Files',
        'fileExt': '*.jpg;*.jpeg;*.gif;*.png',
        'multi': <?php echo $mult; ?>,
        'buttonText': 'Incluir Fotos',
        'displayData': 'speed',
        'simUploadLimit': 1,
        'onComplete': complete,
        onError: function (a, b, c, d) {
        if (d.status == 404)
            alert('Could not find upload script. Use a path relative to: '+'<?= getcwd() ?>');
        else if (d.type === "HTTP")
           alert('error '+d.type+": "+d.status);
        else if (d.type ==="File Size")
           alert(c.name+' '+d.type+' Limit: '+Math.round(d.sizeLimit/1024)+'KB');
        else
           alert('error '+d.type+": "+d.text);
        },
    });

    function complete(evnt, queueID, fileObj, response, data) {
        alert("Foto incluida com sucesso!");
    }
});
function startUpload () {
    var params = '&newFileName='+$('#photo_name').val()
    $('#fileUpload').fileUploadSettings('scriptData', params);
    $('#fileUpload').fileUploadStart();
}
</script>


Se alguém puder me ajudar por favor, agradeço muito!
0

#2 User is offline   Lothor 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 147
  • Joined: 05-August 11
  • Location:Brazil

Posted 08 February 2013 - 07:22 AM

Eu fui testar a extensão aqui e nem consegui terminar de configurar...

É esta aqui certo?

Não gostei dela, a extensão Uploadfy é ótima, mas particularmente não gostei dessa extensão para o Yii, só fez complicar algumas coisas e a tutorial de instalação não é lá tão intuitivo.

Há uma outra aqui que também usa o Uploadfy, é a EUploadfy

-

Em relação ao seu problema, tenta realizar as alterações abaixo e vê se dá certo...

Arquivo uploadifywidget.php

// Substitui a linha abaixo
'script': 'veiculo/uploads',

// Por esta
'script': 'veiculo/upload',


Arquivo _VeiculoController.php

// Substitui a função abaixo
public function actionUploads() {
        return array(
                'upload'=>'application.controllers.upload.UploadFileAction',
        );
}

// Por esta
public function actions() {
        return array(
                'upload'=>'application.controllers.upload.UploadFileAction',
        );
}


Agora, apenas para confirmar, dentro de sua pasta controllers, existe uma pasta upload e o arquivo UploadFileAction.php que veio na extensão correto?

-

Em meus projetos feitos em Yii, tenho utilizado a extensão EAjaxUpload, para realizar os uploads sem recarregar a página.

"Apanhei" um pouco para fazer a extensão funcionar, mas depois que consegui, consegui fazer diversas alterações nela, inclusive, deixando-a internacionalizável.
0

#3 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 08 February 2013 - 01:09 PM

View PostLothor, on 08 February 2013 - 07:22 AM, said:

Eu fui testar a extensão aqui e nem consegui terminar de configurar...

É esta aqui certo?

Não gostei dela, a extensão Uploadfy é ótima, mas particularmente não gostei dessa extensão para o Yii, só fez complicar algumas coisas e a tutorial de instalação não é lá tão intuitivo.

Há uma outra aqui que também usa o Uploadfy, é a EUploadfy

-

Em relação ao seu problema, tenta realizar as alterações abaixo e vê se dá certo...

Arquivo uploadifywidget.php

// Substitui a linha abaixo
'script': 'veiculo/uploads',

// Por esta
'script': 'veiculo/upload',


Arquivo _VeiculoController.php

// Substitui a função abaixo
public function actionUploads() {
        return array(
                'upload'=>'application.controllers.upload.UploadFileAction',
        );
}

// Por esta
public function actions() {
        return array(
                'upload'=>'application.controllers.upload.UploadFileAction',
        );
}


Agora, apenas para confirmar, dentro de sua pasta controllers, existe uma pasta upload e o arquivo UploadFileAction.php que veio na extensão correto?

-

Em meus projetos feitos em Yii, tenho utilizado a extensão EAjaxUpload, para realizar os uploads sem recarregar a página.

"Apanhei" um pouco para fazer a extensão funcionar, mas depois que consegui, consegui fazer diversas alterações nela, inclusive, deixando-a internacionalizável.


Olá Lothor, obrigado peka resposta.

A extensão é esta mesma que vc colocou no link. Fiz as alterações sugeridas por vc e não deu certo. Inclusive descobri que ela pode carregar apenas 1 imagem por vez o que a torna muito inviável. Vou tentar usar EAjaxUpload que vc falou que usa. Se tiver como mandar alguma dica ou exemplo de utilização com relação a ela agradeceria bastante. Valeu!!
0

#4 User is offline   KillCloud 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 16
  • Joined: 02-November 12
  • Location:São Paulo, Brazil

Posted 09 February 2013 - 01:18 PM

Olá Ricardo, você já tentou usar a classe padrão do Yii para upload de arquivos? Dê uma olhada:

http://www.yiiframew...1/CUploadedFile

Caso deseje implementá-la, o tutorial abaixo pode ajudá-lo:

http://www.yiiframew...-using-a-model/

Agora se você precisa mesmo de uma extensão para upload de arquivos, eu sugiro o widget TbFileUpload que vem integrado a extensão Yii Bootstrap, para mais informações sobre como implementá-la veja o link abaixo:

http://www.yiiframew...eupload-widget/

Caso você precise de uma documentação mais detalhada sobre este widget, visite o site do desenvolvedor:

http://blueimp.githu...ry-File-Upload/
0

#5 User is offline   Lothor 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 147
  • Joined: 05-August 11
  • Location:Brazil

Posted 10 February 2013 - 11:14 PM

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.
0

#6 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 70
  • Joined: 04-September 12

Posted 18 February 2013 - 12:52 PM

KillCloud e Lothor, muito obrigado pelas dicas e exemplos. Serão muito úteis. Desculpe não ter respondido antes, estava terminando um outro projeto. Valeu pelas dicas, vou verificar as opções apresentadas e ver o que fica melhor. Quando concluir posto o resultado. Valeu.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users