2016-03-24 26 views
0

Yii2 dosya yükleme işlemini kullanarak dosya yüklemeyi deniyorum ve dosya yoluna veri tabanı kaydedilmiş başarılı oldum ancak dosya, belirttiğim dizine kaydedilmedi .. aşağıdaki kod benim. .Dosyanız karşıya yüklendikten sonra dizin yüklenemedi.

<?php 
namespace backend\models; 
use yii\base\Model; 
use yii\web\UploadedFile; 
use yii\Validators\FileValidator; 
use Yii; 




class UploadForm extends Model 
{ 

/** 
    * @var UploadedFile 

*/ 

public $image; 
public $randomCharacter; 


public function rules(){ 

    return[ 

      [['image'], 'file', 'skipOnEmpty' => false, 'extensions'=> 'png, jpg,jpeg'], 
     ]; 
    } 


public function upload(){ 

    $path = \Yii::getAlias("@backend/web/uploads/"); 

    $randomString = ""; 

    $length = 10; 

    $character = "QWERTYUIOPLKJHGFDSAZXCVBNMlkjhgfdsaqwertpoiuyzxcvbnm1098723456"; 


    $randomString = substr(str_shuffle($character),0,$length); 
       $this->randomCharacter = $randomString; 
      if ($this->validate()){ 

       $this->image->saveAs($path .$this->randomCharacter .'.'.$this->image->extension); 
       //$this->image->saveAs(\Yii::getAlias("@backend/web/uploads/{$randomString}.{$this->image->extension}")); 
       return true; 
     }else{ 
      return false; 
     } 

    } 



} 

o hataları atmak mı FileUpload

namespace backend\controllers; 

use Yii; 
use backend\models\Product; 
use backend\models\ProductSearch; 
use yii\web\Controller; 
use yii\web\NotFoundHttpException; 
use yii\filters\VerbFilter; 
use backend\models\UploadForm; 
use yii\web\UploadedFile; 


public function actionCreate() 
    { 

     $addd_at = time(); 
     $model = new Product(); 
     $upload = new UploadForm(); 

     if($model->load(Yii::$app->request->post())){ 
      //get instance of the uploaded file 
      $model->image = UploadedFile::getInstance($model, 'image'); 

      $upload->upload(); 
      $model->added_at = $addd_at; 
      $model->image = 'uploads/' .$upload->randomCharacter .'.'.$model->image->extension; 

      $model->save(); 
       return $this->redirect(['view', 'product_id' => $model->product_id]); 

     } else{ 
       return $this->render('create', [ 
       'model' => $model, 
       ]); 

      } 

    } 

cevap

0

oluşturmak için kontrolör?

Bu izin konusu bir izin sorunudur. "Yükleme" dizin iznini değiştirmeyi deneyin (sadece test için).

+0

o atmaz: Buna

$path = \Yii::getAlias("@backend/web/uploads/"); 

: Bu satırı değiştirin herhangi bir hata, ben zaten klasörleri izin 777 değiştirildi ve dosya içine kaydetmek olmaz, şimdi iki gün boyunca bu sorunu ile emmek, ben derde deva üzerinde kontrolörde olduğunu düşünüyorum .. $ upload -> yükleme(); çünkü() koşulu gibi kullanıyorum ... ($ upload-> upload()) {$ model-> save();}, veritabanıya hiçbir şey kaydedilmiyor, bu yüzden eğer kullandığımda işlemin durduğunu düşünüyorum. durum, ama ben gerçekten nerede hata olduğunu bilmiyorum .. herhangi bir yardım için teşekkürler – sam

+0

"error_reporting (E_ALL);" ve eğer modeliniz doğrulama işleminden geçemediyse hala hata yoksa –

+0

upload() yönteminin yanlış olup olmadığını görün. Hangi uygulamaların geçerli olmadığını görmek için $ model-> getErrors() öğesini deneyin. –

0

Ürününüzü ($ model) form verileriyle yüklersiniz.

if($model->load(Yii::$app->request->post())) 

Ancak, yükleme formu ($ upload) komut dosyanızda asla dolmaz. Sonuç olarak, $ upload-> resmi boş olacak.

UploadForm kurallarının dosya doğrulayıcısında 'skipOnEmpty' => false değerini bildirdiğinizden, $ upload üzerindeki doğrulama başarısız olur. olduğu

neden senin eğer yukarıdaki yorumlar beyanı (if ($ upload-> yükleme()) $ modeli verileri kaydetmek etmez.

sunmasını başka bir model gerekir neden görmüyorum . Bu amaçla sadece işleri karmaşık, böylece bir öğretici onu kopyalayarak çünkü onun varsayalım sadece aşağıdaki şeyler, düzeltmek ve işler daha basit hale getirmek için:.

Ürün modeli

public $image; 

özelliği ekleyin Resim modeline resim kuralı ekle

[['image'], 'file', 'skipOnEmpty' => false, 'extensions'=> 'png, jpg,jpeg'], 

kontrollerini ayarlayınız eylemi hile yapmak gerekir böyle

public function actionCreate() 
{ 
    $model = new Product(); 

    if($model->load(Yii::$app->request->post()) && $model->validate()) { 
     // load image 
     $image = UploadedFile::getInstance($model, 'image'); 
     // generate random filename 
     $rand = Yii::$app->security->generateRandomString(10); 
     // define upload path 
     $path = 'uploads/' . $rand . '.' . $image->extension; 
     // store image to server 
     $image->saveAs('@webroot/' . $path); 

     $model->added_at = time(); 
     $model->image = $path; 

     if($model->save()) { 
      return $this->redirect(['view', 'product_id' => $model->product_id]); 
     } 
    } else { 
     return $this->render('create', [ 
      'model' => $model, 
     ]); 
    } 
} 

şey yaratmak.

0

Kişisel UploadForm sınıfı yüzden böyle olmalı UploadForm Sınıfı'nın fonksiyon yükleme üzerinde Backend zaten:

$path = \Yii::getAlias("uploads")."/"; 
İlgili konular