3

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

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

4

2 回答 2

4

使用高级模板时,您需要确定一个公共位置来存储前端和后端应用程序都可以访问的文件,此外,如果您希望文件可以通过网络公开访问,您需要确保该位置是公共文件夹。

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

示例从后端上传。

上传表单.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'],
        ];
    }
}

上传控制器

在将管理上传的控制器中,使用前端的别名来设置上传路径$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

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

uploads1在根目录中创建文件夹。

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]]
    ],

如果你有 hide frontend/web 然后在你的项目根目录 (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 回答