Trabalhando Com Upload De Imagens

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!

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!!

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

http://www.yiiframework.com/doc/api/1.1/CUploadedFile

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

http://www.yiiframework.com/wiki/2/how-to-upload-a-file-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.yiiframework.com/wiki/430/how-to-use-yiibooster-tbfileupload-widget/

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

http://blueimp.github.com/jQuery-File-Upload/

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.

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.