Как загрузить файлы в корневую папку в расширенном шаблоне yii2?

Я не могу загрузить файлы в корневую папку.

Я загрузил файлы в корневую папку и получил доступ к этим файлам во внешнем и внутреннем приложениях.


person Bharat Chauhan    schedule 13.02.2015    source источник
comment
Возможно, вы не можете загружать в корневую папку, но в любом случае вы можете получить доступ к файлам как из внешнего, так и из внутреннего интерфейса, это зависит от того, как вы настроите свои URL-адреса на производстве.   -  person sirjay    schedule 13.02.2015
comment
если вы находитесь в linux, вам нужно дать доступ apache к корневой папке с помощью chown -R www-data:www-data /root   -  person iamawebgeek    schedule 13.02.2015
comment
вы на самом деле имеете в виду папку /root или вы имеете в виду корневую (основную) папку приложения?   -  person Mihai P.    schedule 15.02.2015
comment
@Bharat - ниже ответ напишите, что вы можете загружать свои файлы из бэкэнда в папку frontend/web/upload, и вы можете получить доступ к этим загруженным изображениям во внешнем интерфейсе   -  person Kailas    schedule 03.09.2015
comment
@zazu Я получаю эту ошибку: finfo_file(/tmp/phpGjxsrP): failed to open stream: No such file or directory. Это проблема разрешения? как я могу дать разрешение на каталог tmp. Я использую убунту (15.10)   -  person Muhammad Shahzad    schedule 20.04.2016


Ответы (2)


При использовании расширенного шаблона вам необходимо выбрать общее место для хранения ваших файлов, доступное как для внешнего, так и для внутреннего приложения, кроме того, если вы хотите, чтобы файлы были общедоступны через Интернет, вам необходимо убедиться, что это место является общая папка.

Я склонен использовать папку 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]);

    }
}

Форма просмотра

Добавьте форму в свое представление, обязательно установите тип enctype 'multipart/form-data', чтобы он мог принимать загрузку файлов.

<?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, чтобы вы могли получить доступ как из внешнего, так и из внутреннего интерфейса.

person Levi Putna    schedule 22.04.2015

Вот полное решение для загрузки, обновления, удаления изображения. Пожалуйста, внимательно следуйте инструкциям.

1 Создайте папку uploads в корневом каталоге.

2 Корневой псевдоним в Yii2

Откройте файл 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; ?>">
person Muhammad Shahzad    schedule 14.04.2016
comment
Я могу загружать файлы, но не вижу их в поле зрения. В чем может быть проблема? - person Dmytro; 17.07.2016
comment
как вы отображаете изображение в поле зрения? поделитесь своим кодом. попробуй вот это: Yii::getAlias('@root') .'/uploads/' . $model->image - person Muhammad Shahzad; 17.07.2016
comment
<?php echo Html::img('../../uploads/ring.jpg',['class' => 'img-center', 'width'=>150, 'heigth'=>150, 'alt'=>'no image']) ?>. Я пробовал также с getAlias ​​- безуспешно. Может быть какие-то ограничения в папках? Моя ОС Windows 10. - person Dmytro; 17.07.2016
comment
Вероятно, ваш DocumentRoot на вашем веб-сервере — www/yiiapplication/. Но у меня это www/yiiapplication/backend/web. Не знаете, как получить доступ к www/yiiapplication/uploads в этом случае? - person Dmytro; 18.07.2016
comment
@MuhammadShahzad, файлы просмотра с gridview не могут загружать изображения, как вы упомянули выше. Получение ошибки 404 при доступе к изображениям в новой вкладке. - person sankar muniyappa; 29.08.2016
comment
где вы храните изображения? какой у вас корень .htaccess? - person Muhammad Shahzad; 29.08.2016
comment
Я сохранил изображения в корневом каталоге в соответствии с вашими шагами. А также я разделил URL-адреса переднего и заднего конца, используя только .htaccess. - person sankar muniyappa; 29.08.2016
comment
Вы добавили это в свой корневой файл .htaccess? RewriteCond %{REQUEST_URI} /(uploads) RewriteRule ^uploads/(.*)$ uploads/$1 [L] - person Muhammad Shahzad; 29.08.2016
comment
@MuhammadShnahzad, теперь все работает нормально. Ваш ответ принят - person sankar muniyappa; 29.08.2016