3

ルート フォルダーにファイルをアップロードできません。

ルート フォルダーにファイルをアップロードし、フロントエンドおよびバックエンド アプリケーションでこれらのファイルにアクセスします。

4

2 に答える 2

4

高度なテンプレートを使用する場合、フロントエンド アプリケーションとバックエンド アプリケーションの両方からアクセスできるファイルを保存する共通の場所を決定する必要があります。パブリック フォルダー。

私は一般的なアップロード場所として frontend/web フォルダーを使用する傾向があります。バックエンドからアップロードするときは、この場所に書き込みます。その後、フロントエンドで画像を使用できます。

バックエンドからのアップロードの例。

UploadForm.php

アップロード データを管理するモデルを作成し、必ず file 属性を含めます。

class UploadForm extends Model
{
    /**
     * @var UploadedFile file attribute
     */
    public $file;

    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            [['file'], 'file', 'extensions'=>'jpg, gif, png'],
        ];
    }
}

UploadController

アップロードを管理するコントローラーで、フロントエンドのエイリアスを使用してアップロード パスを設定します。$path = Yii::getAlias('@frontend') .'/web/uploads/'

class MediaController extends Controller
{

    public function actionIndex()
    {

        $model = new UploadForm();

        //Set the path that the file will be uploaded to
        $path = Yii::getAlias('@frontend') .'/web/upload/'

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

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

        return $this->renderPartial('index', ['model' => $model]);

    }
}

フォームを見る

ビューにフォームを追加し、'multipart/form-data'ファイルのアップロードを受け入れることができるように enctype を設定してください。

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

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

    <?= Html::submitButton('Upload') ?>

<?php ActiveForm::end() ?>

フロントエンド

その後、/upload/{image-name}.{extension} 経由でフロント エンドの画像にアクセスできます。例<img src="/upload/sample.png">

注: フロントエンドとバックエンドの両方からアクセスできるように、アップロード パスを common/config/params.php に保存することをお勧めします。

于 2015-04-22T05:15:38.623 に答える
2

これは、画像のアップロード、更新、削除の完全なソリューションです。慎重に手順に従ってください。

1uploadsルート ディレクトリにフォルダを作成します。

Yii2 の 2 つのルート エイリアス

common/config/bootstrap.php を開き、この行をファイルの先頭に追加します

Yii::setAlias('@root', realpath(dirname(__FILE__).'/../../'));

---

3 モデル:

public function rules()
    {
    return [

        ['image', 'image', 
                    'skipOnEmpty' => true, 
                    'extensions' => 'jpg, gif, png']

        ];
    }

4 ファイル入力

<?php
use yii\widgets\ActiveForm;
?>

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

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

    <button>Submit</button>

<?php ActiveForm::end() ?>

5 コントローラーアクション

 class PostController extends Controller
   {
       public function actionCreate()
       {
        $model = new Post();
        if ($model->load(Yii::$app->request->post())) {            
            $file = \yii\web\UploadedFile::getInstance($model, 'image');
            if (!empty($file))
                $model->image = $file;

            if($model->save())
            {
             if (!empty($file))
              $file->saveAs( Yii::getAlias('@root') .'/uploads/' . $file);

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

       public function actionUpdate($id)
       {
        $model = $this->findModel($id);
        if ($model->load(Yii::$app->request->post())){           
            $file = \yii\web\UploadedFile::getInstance($model, 'image');
           if (!empty($file)){
                 $delete = $model->oldAttributes['image'];
                 $model->image= $file; 
            }
            else{
                $model->image = $model->oldAttributes['image'];
            }
            if($model->save())
            {
             if (!empty($file))
              $file->saveAs( Yii::getAlias('@root') .'/uploads/' . $file);

              return $this->redirect(['view', 'id' => $model->id]);
            }
            return $this->render('update', ['model' => $model]);
        } else {
            return $this->render('update', ['model' => $model]);
        }
    }

       public function actionDelete($id)
       {
        $model = $this->findModel($id);
        if(file_exists(Yii::getAlias('@root') . '/uploads/'. $model->image))
        unlink(Yii::getAlias('@root') . '/uploads/'. $model->image);
        $model->delete(); 
         return $this->redirect(['index']);
       }

  }

編集:

6 Gridviewで表示(バックエンド)

[
'attribute' => 'image',
'format' => 'html',    
'value' => function ($data) {
    return Html::img('../../../uploads/'. $data['image'],
        ['width' => '70px']);
 },
],

7 DetailViewで表示(バックエンド)

   [
      'attribute'=>'image',
      'label'=> 'Post Picture',
      'value'=> '../../../uploads/' . $model->image,
      'format'=>['image',['width'=>100, 'height'=>100]]
    ],

フロントエンド/ウェブを非表示にしている場合は、プロジェクト ルート (yii2-app) の .htaccess ファイルに次のルールを追加します。

RewriteEngine on

  RewriteCond %{REQUEST_URI} /(uploads)
  RewriteRule ^uploads/(.*)$ uploads/$1 [L]

フロントエンドに画像を表示

 <img src="<?php echo 'uploads/'.$model->image; ?>">
于 2016-04-14T12:22:56.997 に答える