我无法在根文件夹中上传文件。
我在根文件夹中上传文件,并在前端和后端访问这些文件 应用
答案 0 :(得分:4)
使用高级模板时,您需要确定存储可由前端和后端应用程序访问的文件的公共位置,此外,如果您希望通过Web公开访问这些文件,则需要确保location是一个公用文件夹。
我倾向于使用frontend / web文件夹作为我的常用上传位置。从后端上传时,我写到这个位置。然后我可以使用前端的图像。
从后端上传示例。
<强> UploadForm.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'],
];
}
}
<强> 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中,以便可以从前端和后端进行访问。
答案 1 :(得分:2)
这是图像上传,更新,删除图像的完整解决方案。 请仔细按照步骤操作。
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; ?>">