2014-05-11 22 views
21

Bir ActiveForm'um var ve kullanıcının fotoğraflarını karşıya yükleyebileceği bir alan eklemek istiyorum. problemi, kullanıcı tablosundaki görüntü için bir öznitem yok ve 'yii' içindeki her giriş alanı, bir modeli ve bir niteliği aşağıdaki gibi bekler.Yii2'de bir dosyaya nasıl dosya yükleyebilirim?

<?= $form->field($model, 'attribute')->input($platforms) ?> 

i herhangi bir kayıt için görüntü atamak istemiyorsanız ne de ben onu belirli bir klasöre yüklenecek istiyorum veritabanında eklemek istiyorum.

Ayrıca kartik'in yazdığı kütüphaneyi de kontrol ettim, ama aynı zamanda bir özellik alanı gerektiriyor.

+0

(http://stackoverflow.com/questions/28493615/how-to- upload-files-in-root-klasör-in-yii2-advanced-template/36622990 # 36622990) adım çözüm adım! –

cevap

40

resmi belgeleri izleyin

https://github.com/yiisoft/yii2/blob/master/docs/guide/input-file-upload.md

Formu Modeli

namespace app\models; 

use yii\base\Model; 
use yii\web\UploadedFile; 

/** 
* UploadForm is the model behind the upload form. 
*/ 
class UploadForm extends Model 
{ 
/** 
* @var UploadedFile|Null file attribute 
*/ 
public $file; 

/** 
* @return array the validation rules. 
*/ 
public function rules() 
{ 
    return [ 
     [['file'], 'file'], 
    ]; 
} 
} 
?> 

Form görünümü

<?php 
use yii\widgets\ActiveForm; 

$form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?> 

<?= $form->field($model, 'file')->fileInput() ?> 

<button>Submit</button> 

<?php ActiveForm::end(); ?> 

Kontrolör

Şimdi birlikte formu ve modelini bağlayan denetleyicisi oluşturmak:

<?php 
namespace app\controllers; 

use Yii; 
use yii\web\Controller; 
use app\models\UploadForm; 
use yii\web\UploadedFile; 

class SiteController extends Controller 
{ 
public function actionUpload() 
{ 
    $model = new UploadForm(); 

    if (Yii::$app->request->isPost) { 
     $model->file = UploadedFile::getInstance($model, 'file'); 

     if ($model->validate()) {     
      $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension); 
     } 
    } 

    return $this->render('upload', ['model' => $model]); 
} 
} 
?> 

model->load(...) yerine UploadedFile::getInstance(...) kullanıyoruz. [[\yii\web\UploadedFile|UploadedFile]], model doğrulamasını çalıştırmaz. Sadece yüklenen dosya hakkında bilgi sağlar. Bu nedenle, doğrulama işlemini $model->validate() aracılığıyla el ile çalıştırmanız gerekir. Bu bir dosya bekliyor [[yii\validators\FileValidator|FileValidator]] tetikler:

$file instanceof UploadedFile || $file->error == UPLOAD_ERR_NO_FILE //in code framework 

doğrulama başarılı olursa, o zaman dosyayı kurtarıyorsun: "temel" uygulama şablonu sonra klasör yüklemeleri kullanıyorsanız

$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension); 

gerektiği web altında oluşturulabilir.

İşte bu kadar. Sayfayı yükle ve yüklemeyi dene. Uplaodlar temel/web/upload'larda sona ermelidir. Bunun için foreach kullanmalıdır yüklerken birden fazla dosya varsa

+0

Bir ek alan eklemem gerekirse ve kontrol edildikten sonra değerini almam gerekiyorsa. Bunu nasıl yapabilirim. varsayım id, aktif formda id = 23 değerini ayarladı. – Kshitiz

+0

@ Kshitiz'i gönderdikten sonra denetleyicide bu değeri nasıl alacağınız - POSTed değişkenlerini ayrıca yüklemeniz gerekir. bu yüzden önce $ model-> load (Yii :: $ app-> request-> post()) 'a ihtiyacınız olacak ve yüklenen dosyaları dosya özniteliğine atayacaksınız. – hackerone

+0

db'ye nasıl tasarruf edeceğinizi de söyleyebilir misiniz? – aWebDeveloper

6

Oluştur okumak sadece public $image gibi modeliniz için bağlantılı hale getirmenin ve kumanda içinde görünümünde

use kartik\widgets\ActiveForm; 
use kartik\widgets\FileInput; 

$form = ActiveForm::begin(['options' => ['enctype'=>'multipart/form-data']]); //important 
echo FileInput::widget([ 
        'name' => 'filename', 
        'showUpload' => false, 
        'buttonOptions' => ['label' => false], 
        'removeOptions' => ['label' => false], 
        'groupOptions' => ['class' => 'input-group-lg'] 
       ]); 
echo Html::submitButton('Submit', ['class'=>'btn btn-primary']); 
ActiveForm::end(); 

yılında

<?= $form->field($model, 'image')->fileInput() ?> 
14

gibi devam

$file = \yii\web\UploadedFile::getInstanceByName('filename'); 
$file->saveAs('/your/directory/'.$file->name); 
+0

Eğer '$ file'' NULL' olacaksa, kodunuz çökecektir! – trejder

+0

bu sadece bir örnektir. Eğer bunu yapabilirim, biliyorum, –

+1

$ filel null koşulu koyabilirsiniz. Sadece sizi bilgilendiriyorum, kodunuz ciddi bir hata içeriyor. Cevabınızı düzenleyemem (düzeltmemeliyim) ve kendim düzeltemem çünkü Stack Overflow'daki etik kurallar sadece küçük hataları düzeltmek için düzenlemeyi kullanıyor. Kodda bir hata olduğunda, yazarı ona bildirilmeli ve el ile düzeltmesi istenmelidir. Ben de öyle yaptım. – trejder

0

yüklenen kod

//save the path in DB.. 
       $model->file = 'uploads/'.$imageName.'.'.$model->file->extension; 
       $model->save(); 
0

sonra bu kodu verir. Ve tablodaki bir sütunda gerçek dosya adını ve bu adın şifreli bir değerinin dizinde çoğaltılmasını önlemek için saklanması gerekir. Böyle bir şey ..

$userdocs->document_name = UploadedFile::getInstances($userdocs, 'document_name'); 

foreach ($userdocs->document_name as $key => $file) { 
    $img_name = Yii::$app->security->generateRandomString(); 
    $file->saveAs('user/business_files/' . $img_name . '.' . $file->extension); 
    $images = $img_name . '.' . $file->extension; 
    $userdocs->actual_name = $file->name; 
    $userdocs->user_id = $user->id; 
    $userdocs->document_name = $images; 
    $userdocs->save(false); 
    $userdocs = new UserDocs(); 
} 

İşte rastgele dize üretilir ve bu belgenin adı ile atamak olacak ve o tabloda saklanır. UserDocs model adıdır.

2

Gerçekten Yii2 Dropzone'u beğeniyorum.

Montaj:

composer require --prefer-dist perminder-klair/yii2-dropzone "dev-master" 

Kullanım:

<?php 
    echo \kato\DropZone::widget([ 
     'options' => [ 
      'url'=> Url::to(['resource-manager/upload']), 
      'paramName'=>'image', 
      'maxFilesize' => '10', 
     ], 
     'clientEvents' => [ 
      'complete' => "function(file){console.log(file)}", 
      'removedfile' => "function(file){alert(file.name + ' is removed')}" 
     ], 
    ]); 

    ?> 

Kontrol:

[Burada]
public function actionUpload(){ 

     $model = new ResourceManager(); 
     $uploadPath = Yii::getAlias('@root') .'/uploads/'; 

     if (isset($_FILES['image'])) { 
      $file = \yii\web\UploadedFile::getInstanceByName('image'); 
      $original_name = $file->baseName; 
      $newFileName = \Yii::$app->security 
          ->generateRandomString().'.'.$file->extension; 
      // you can write save code here before uploading. 
      if ($file->saveAs($uploadPath . '/' . $newFileName)) { 
       $model->image = $newFileName; 
       $model->original_name = $original_name; 
       if($model->save(false)){ 
        echo \yii\helpers\Json::encode($file); 
       } 
       else{ 
        echo \yii\helpers\Json::encode($model->getErrors()); 
       } 

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

     return false; 
    } 
İlgili konular