ルート フォルダーにファイルをアップロードできません。
ルート フォルダーにファイルをアップロードし、フロントエンドおよびバックエンド アプリケーションでこれらのファイルにアクセスします。
ルート フォルダーにファイルをアップロードできません。
ルート フォルダーにファイルをアップロードし、フロントエンドおよびバックエンド アプリケーションでこれらのファイルにアクセスします。
高度なテンプレートを使用する場合、フロントエンド アプリケーションとバックエンド アプリケーションの両方からアクセスできるファイルを保存する共通の場所を決定する必要があります。パブリック フォルダー。
私は一般的なアップロード場所として 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 に保存することをお勧めします。
これは、画像のアップロード、更新、削除の完全なソリューションです。慎重に手順に従ってください。
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; ?>">