如何在yii2高级模板中的根文件夹中上传文件?

时间:2015-02-13 06:15:06

标签: yii2 yii2-advanced-app

我无法在根文件夹中上传文件。

我在根文件夹中上传文件,并在前端和后端访问这些文件 应用

2 个答案:

答案 0 :(得分:4)

使用高级模板时,您需要确定存储可由前端和后端应用程序访问的文件的公共位置,此外,如果您希望通过Web公开访问这些文件,则需要确保location是一个公用文件夹。

我倾向于使用frontend / web文件夹作为我的常用上传位置。从后端上传时,我写到这个位置。然后我可以使用前端的图像。

从后端上传示例。

<强> UploadForm.php

创建一个模型来管理上传数据,确保包含文件属性。

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中,以便可以从前端和后端进行访问。

答案 1 :(得分:2)

这是图像上传,更新,删除图像的完整解决方案。 请仔细按照步骤操作。

1在根目录中创建uploads文件夹。

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(Backend)中显示

   [
      '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; ?>">