[SOLVED] Upload di file

Sono diverse ore che sto cercando di risolvere un problema: upload di un filmato.

In particolare ho fatto un form per l’invio dei dati. Funziona tutto bene. Arrivo a selezionare il mio video, e quindi a caricarlo. Poi arrivo nella actionCreate(). Vedo normalmente la variabile $_FILES ma non accade nulla all’esecuzione di $model->path->saveAs($new);

Ho anche impostato error_reporting = E_ALL.

Ho provato ad impostare post_max_size = 888M.

Non riesco a comprendere quale sia l’errore. Ho anche impostato a 777 i permessi della cartella “media” dove, in teoria, dovrei andare a salvare il filmato. Il percorso ($new) è corretto: /var/www/NOME_SITO/media. Che cosa non vedo? Dove sto sbagliando?




  public function actionCreate() {

    $model = new Videos;

    if (isset($_POST['Videos'])) {

      $model->attributes = $_POST['Videos'];

      if ($model->save()) {

        if (@$_FILES['Videos']['name']['path']) {

          if (CUploadedFile::getInstance($model, 'path') != "") {

            $model->path = $_FILES['Videos']['name']['path'];

            $path = substr(Yii::app()->basePath, 0, strrpos(Yii::app()->basePath, '/')) . '/media';

            $new = $path.'/'.$model->path;

            $model->path->saveAs($new);

          }

        }

        $this->redirect(array('view', 'id' => $model->id));

      }

    }

    $this->render('create', array(

        'model' => $model,

    ));

  }



A prima occhiata mi viene strano questo codice




            $model->path = $_FILES['Videos']['name']['path'];

        	...

            $model->path->saveAs($new);



Non dovrebber $model->path essere un instanza di CUploadedFile ?

Intanto grazie per la risposta. Ho modificato lo script.


$model->path->saveAs($new);

Continua a non andare. $new è corretto, i permessi sono sempre 777, ma l’if mi stampa ‘ko’:




            if($model->path->saveAs($new)) {

              echo 'ok';

            } else {

              echo 'ko';

            }



Ecco tutto il codice:




  public function actionCreate() {

    $model = new Videos;

    if (isset($_POST['Videos'])) {

      $model->attributes = $_POST['Videos'];

      if ($model->save()) {

        if (@$_FILES['Videos']['name']['path']) {

          if (CUploadedFile::getInstance($model, 'path') != "") {

            $model->path = CUploadedFile::getInstance($model, 'path');;

            $path = substr(Yii::app()->basePath, 0, strrpos(Yii::app()->basePath, '/')) . '/media';

            $new = $path.'/'.$model->path;

            if($model->path->saveAs($new)) {

              echo 'ok';

            } else {

              echo 'ko';

            }

            die('');

          }

        }

        $this->redirect(array('view', 'id' => $model->id));

      }

    }

    $this->render('create', array(

        'model' => $model,

    ));

  }



Wow! Sono andato in CUploadedFile modiicandolo in questo modo:




  public function saveAs($file, $deleteTempFile=true) {

    die($this->_tempName . '<br />' . $file);

  }



Ho scoperto che il nome del file temporaneo e del nome nuovo erano identici. A questo punto sono tornato nella mia actionCreate. Ho fatto un var_dump($_FILES). Guarda un po’ che cosa è saltato fuori:


var_dump($_FILES);




array(1) {

  ["Videos"]=>

  array(5) {

    ["name"]=>

    array(1) {

      ["path"]=>

      string(27) "49_1113_1_1_raitv_nuovo.wmv"

    }

    ["type"]=>

    array(1) {

      ["path"]=>

      string(0) ""

    }

    ["tmp_name"]=>

    array(1) {

      ["path"]=>

      string(0) ""

    }

    ["error"]=>

    array(1) {

      ["path"]=>

      int(1)

    }

    ["size"]=>

    array(1) {

      ["path"]=>

      int(0)

    }

  }

}



Io mi aspettavo qualcos’altro. Per esempio il nome del file temporaneo o altri valori. Può darsi che il mio errore sia nel model o nel form?

Nel form, il campo path (che per me è il path dle filmato), l’ho inserito in questo modo.




<div class="form">

  <?php

  $form = $this->beginWidget('CActiveForm', array(

        'id' => 'videos-form',

        'enableAjaxValidation' => false,

        'htmlOptions' => array('enctype' => 'multipart/form-data'),

    ));

  ?>

    <?php echo $form->labelEx($model, 'path'); ?>

    <?php echo CHtml::activeFileField($model, 'path', array('size' => 60, 'maxlength' => 250)); ?>

  <?php $this->endWidget(); ?>

</div><!-- form -->



Non sara che usi anchora la stessa versione PHP… ti rimando ad un tuo vecchio post - http://www.yiiframework.com/forum/index.php?/topic/15941-model-diversi-stesso-codice-ma-versione-di-php/page__view__findpost__p__79336

E in questo post inglese che la spiegazione per lo stesso problema - http://www.yiiframework.com/forum/index.php?/topic/15949-some-mistakes-with-php-version/page__view__findpost__p__79378

Ti ringrazio. Il problema non era quello del mio vecchio post. Non era nemmeno quello del post inglese.

Però nel mio vecchio post, rebus mi aveva dato un suggerimento per il file php.ini. Questa volta era una impostazione di questo file. In particolare. Non avevo impostato nessuna directory temporanea.

upload_tmp_dir

Ho assegnato un valore a questa variabile ed ora:


object(CUploadedFile)#35 (7) {

  ["_name":"CUploadedFile":private]=>

  string(27) "49_1113_1_1_raitv_nuovo.wmv"

  ["_tempName":"CUploadedFile":private]=>

  string(14) "/tmp/phpIkdDTA"

  ["_type":"CUploadedFile":private]=>

  string(14) "video/x-ms-wmv"

  ["_size":"CUploadedFile":private]=>

  int(2252008)

  ["_error":"CUploadedFile":private]=>

  int(0)

  ["_e":"CComponent":private]=>

  NULL

  ["_m":"CComponent":private]=>

  NULL

}



Dovrebbe essere andato tutto a posto. Ed in più ho imparato anche una cosa nuova di php.ini =). Non solo un vecchio post mi è stato utilissimo per trovare una soluzione al problema. Grazie ancora mdomba.