Я не могу загрузить файлы в корневую папку.
Я загрузил файлы в корневую папку и получил доступ к этим файлам во внешнем и внутреннем приложениях.
Я не могу загрузить файлы в корневую папку.
Я загрузил файлы в корневую папку и получил доступ к этим файлам во внешнем и внутреннем приложениях.
При использовании расширенного шаблона вам необходимо выбрать общее место для хранения ваших файлов, доступное как для внешнего, так и для внутреннего приложения, кроме того, если вы хотите, чтобы файлы были общедоступны через Интернет, вам необходимо убедиться, что это место является общая папка.
Я склонен использовать папку 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, чтобы вы могли получить доступ как из внешнего, так и из внутреннего интерфейса.
Вот полное решение для загрузки, обновления, удаления изображения. Пожалуйста, внимательно следуйте инструкциям.
uploads
в корневом каталоге.Откройте файл common/config/bootstrap.php и добавьте эту строку в начало файла.
Yii::setAlias('@root', realpath(dirname(__FILE__).'/../../'));
---
public function rules()
{
return [
['image', 'image',
'skipOnEmpty' => true,
'extensions' => 'jpg, gif, png']
];
}
<?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() ?>
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']);
}
}
[
'attribute' => 'image',
'format' => 'html',
'value' => function ($data) {
return Html::img('../../../uploads/'. $data['image'],
['width' => '70px']);
},
],
[
'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; ?>">
Yii::getAlias('@root') .'/uploads/' . $model->image
- person Muhammad Shahzad; 17.07.2016
<?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
RewriteCond %{REQUEST_URI} /(uploads) RewriteRule ^uploads/(.*)$ uploads/$1 [L]
- person Muhammad Shahzad; 29.08.2016
chown -R www-data:www-data /root
- person iamawebgeek   schedule 13.02.2015finfo_file(/tmp/phpGjxsrP): failed to open stream: No such file or directory
. Это проблема разрешения? как я могу дать разрешение на каталогtmp
. Я использую убунту (15.10) - person Muhammad Shahzad   schedule 20.04.2016