我无法上传根文件夹中的文件。
我在根文件夹中上传文件并在前端和后端应用程序中访问这些文件。
使用高级模板时,您需要确定一个公共位置来存储前端和后端应用程序都可以访问的文件,此外,如果您希望文件可以通过网络公开访问,您需要确保该位置是公共文件夹。
我倾向于使用 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 中,以便您可以从前端和后端访问。
这是图像上传,更新,删除图像的完整解决方案。请仔细按照步骤操作。
uploads
1在根目录中创建文件夹。打开你的 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]]
],
如果你有 hide frontend/web 然后在你的项目根目录 (yii2-app) .htaccess 文件中添加这个规则:
RewriteEngine on
RewriteCond %{REQUEST_URI} /(uploads)
RewriteRule ^uploads/(.*)$ uploads/$1 [L]
<img src="<?php echo 'uploads/'.$model->image; ?>">