首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
7.1 调用小部件的两种方式
7.1.1 调用widget()方法使用小部件DatePicker
7.1.2 调用begin()和end()方法使用小部件ActiveForm
7.2 项目实现迭代八:使用ActiveForm小部件替换添加文章视图
7.2.1 调用小部件ActiveForm
7.2.2 “文章标题”文本输入框
7.2.3 “文章栏目”下拉列表框
7.2.4 “文章图片”上传文件输入框
7.2.5 “内容”文本输入域
7.3 自定义小部件
7.3.1 继承Widget
7.3.2 自定义小部件的MVC结构
7.4 项目实现迭代九:自定义首页幻灯片小部件
7.5 项目实现迭代十:分页显示列表页
7.5.1 分页组件Pagination
7.5.2 新闻中心列表页实现数据填充
7.5.3 分页的超链接列表小部件LinkPager
8.1 初识资源包类
8.2 Yii2框架资源管理代码分析
8.2.1 视图中注册资源包类
8.2.2 注册资源文件
8.2.3 输出缓冲区的数据
8.3 AssetBundle类的成员属性
8.4 项目实现迭代十一:本书配套项目实现前端资源管理
8.4.1 实现首页前端资源管理
8.4.2 实现新闻中心列表页前端资源管理
9.1 模型中编写验证规则
9.2 控制器中安全赋值
9.3 控制器中触发验证
9.4 视图中提取错误信息
9.5 项目实现迭代十二:完成“添加文章”页面中的模型验证
10.1 AJAX简介
10.2 传统的JavaScript实现AJAX验证
10.2.1 创建AJAX引擎XMLHttpRequest对象
10.2.2 创建HTTP请求
10.2.3 设置响应HTTP请求状态变化的方法
10.2.4 设置获取服务器返回数据的语句
10.2.5 发送HTTP请求
10.3 jQuery实现AJAX验证
10.4 项目实现迭代十三:完成“添加用户”页面的AJAX验证
11.1 用户登录-表单模型
11.2 用户登录-客户端验证
11.2.1 ActiveForm实现客户端验证代码分析
11.2.2 项目实现迭代十四:完成登录页面的客户端验证
11.3 模型中的自定义方法作为rules()验证器
11.4 用于验证用户名和密码的身份类UserIdentity
11.5 项目实现迭代十五:完成用户登录
11.6 保存用户登录状态的yii\web\User类
12.1 访问控制技术综述
12.2 RBAC简介
12.3 RBAC需求分析及功能概述
12.4 项目实现迭代十六:最简方式实现RBAC
12.4.1 数据库设计
12.4.2 用户管理
12.4.3 角色管理
12.4.4 权限管理
12.4.5 用户—角色配置管理
12.4.6 角色—权限配置管理
12.5 项目实现迭代十七:使用yii\rbac\DbManager实现 RBAC
12.5.1 基本概念
12.5.2 用户管理
12.5.3 角色管理
12.5.4 权限管理
12.5.5 权限管理系统验证
12.6 项目实现迭代十八:使用yii2-admin扩展实现RBAC
12.6.1 配置
12.6.2 使用的数据库表
12.6.3 路由列表
12.6.4 角色列表
12.6.5 用户列表
12.6.6 菜单列表
12.6.7 集成AdminLTE后台主题及菜单展示
12.6.8 基于存取控制过滤器(ACF)的用户登录页面
当前位置:
首页>>
技术小册>>
Yii2框架从入门到精通(中)
小册名称:Yii2框架从入门到精通(中)
### 7.2.4 “文章图片”上传文件输入框 在Web开发中,文件上传是一个常见且重要的功能,特别是在构建内容管理系统(CMS)或博客平台时,如使用Yii2框架开发文章发布系统时,允许用户为文章添加图片是提升内容可读性和吸引力的关键步骤。本章节将详细讲解如何在Yii2框架中实现“文章图片”的上传功能,包括前端文件输入框的创建、后端处理逻辑以及文件存储策略。 #### 7.2.4.1 前端实现:创建文件上传输入框 在Yii2中,文件上传通常通过HTML的`<input type="file">`标签实现。为了与Yii2的表单验证和文件处理机制无缝集成,建议使用Yii2的ActiveForm组件来构建表单。以下是一个简单的示例,展示了如何在文章编辑表单中添加图片上传功能。 **视图文件(例如:`views/article/update.php`)** ```php <?php use yii\helpers\Html; use yii\widgets\ActiveForm; /* @var $this yii\web\View */ /* @var $model app\models\Article */ /* @var $form yii\widgets\ActiveForm */ ?> <div class="article-update"> <h1><?= Html::encode($this->title) ?></h1> <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?> <?= $form->field($model, 'title')->textInput(['maxlength' => true]) ?> <?= $form->field($model, 'content')->textarea(['rows' => 6]) ?> <!-- 图片上传输入框 --> <?= $form->field($model, 'imageFile')->fileInput() ?> <!-- 显示已上传的图片(如果有) --> <?php if (!empty($model->image)): ?> <div class="form-group"> <img src="<?= Yii::$app->request->baseUrl . '/uploads/' . $model->image ?>" alt="Article Image" style="max-width: 200px;"> <p>Current Image: <?= Html::a('Delete', ['delete-image', 'id' => $model->id], ['class' => 'btn btn-danger btn-sm', 'data' => [ 'confirm' => 'Are you sure you want to delete this image?', 'method' => 'post', ]]) ?></p> </div> <?php endif; ?> <div class="form-group"> <?= Html::submitButton('Save', ['class' => 'btn btn-primary']) ?> </div> <?php ActiveForm::end(); ?> </div> ``` 注意几个关键点: - `enctype` 属性在 `ActiveForm::begin()` 方法中被设置为 `'multipart/form-data'`,这是处理文件上传所必需的。 - 使用 `$form->field($model, 'imageFile')->fileInput()` 创建文件上传输入框,其中 `'imageFile'` 应该是你的模型(`Article`)中用于接收上传文件的属性。 - 如果文章已有图片,则显示该图片并提供删除链接。 #### 7.2.4.2 后端处理:文件上传逻辑 在Yii2中,文件上传通常涉及模型验证和文件保存两个步骤。 **模型验证(`Article.php`)** 首先,在模型中添加文件上传的验证规则。 ```php namespace app\models; use Yii; use yii\base\Model; use yii\web\UploadedFile; class Article extends \yii\db\ActiveRecord { // ... 其他属性和方法 public $imageFile; // 用于存储上传文件的实例 public function rules() { return [ // ... 其他验证规则 [['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, jpeg', 'maxSize' => 1024 * 1024 * 2], // 2MB限制 ]; } // ... 其他方法 } ``` **控制器逻辑(`ArticleController.php`)** 在控制器中,处理表单提交并保存文件。 ```php namespace app\controllers; use Yii; use yii\web\Controller; use app\models\Article; use yii\web\UploadedFile; class ArticleController extends Controller { // ... 其他方法 public function actionUpdate($id) { $model = $this->findModel($id); if ($model->load(Yii::$app->request->post()) && $model->save()) { // 文件上传处理 $imageName = time() . '.' . $model->imageFile->extension; $filePath = Yii::getAlias('@app/uploads/') . $imageName; if ($model->imageFile->saveAs($filePath)) { // 更新数据库中的图片路径 $model->image = $imageName; $model->save(false); // 不需要再次验证 return $this->redirect(['view', 'id' => $model->id]); } } return $this->render('update', [ 'model' => $model, ]); } // ... 其他方法 } ``` 注意: - 使用了 `UploadedFile` 类的 `saveAs()` 方法来保存文件到指定路径。 - 使用了 `Yii::getAlias('@app/uploads/')` 来获取上传目录的绝对路径,这里假设你已经在配置文件中定义了 `@app/uploads` 别名。 - 更新数据库中的图片路径字段(`image`)以反映新上传的图片文件名。 #### 7.2.4.3 文件存储策略 文件存储策略是文件上传功能设计中的一个重要方面。在Yii2项目中,你可以根据实际需求选择不同的存储方案,如直接存储在服务器文件系统、使用云存储服务(如Amazon S3、阿里云OSS等)或数据库(尽管不推荐用于大文件)。 - **文件系统存储**:如上例所示,文件直接保存在服务器的某个目录下。这种方式简单直接,但需要注意文件的安全性和备份问题。 - **云存储服务**:对于需要高可用性和可扩展性的应用,使用云存储服务可能是一个更好的选择。Yii2提供了扩展或组件来支持多种云存储服务,你可以根据需求选择合适的扩展进行集成。 - **数据库存储**:虽然理论上可以将文件内容直接存储在数据库中(如使用BLOB类型字段),但这通常不推荐用于大文件,因为这会显著增加数据库的大小和查询性能问题。 #### 7.2.4.4 安全性和性能考虑 - **验证上传的文件**:确保上传的文件类型、大小和数量符合你的安全策略和业务需求。 - **防止目录遍历**:确保上传的文件不能通过URL直接访问,以避免潜在的安全风险。 - **优化存储路径**:为上传的文件设置合理的存储路径和命名规则,以便于管理和访问。 - **备份和恢复**:定期备份上传的文件,以防止数据丢失。 通过上述步骤,你可以在Yii2框架中成功实现“文章图片”的上传功能,并确保其既满足业务需求又具备良好的安全性和性能。
上一篇:
7.2.3 “文章栏目”下拉列表框
下一篇:
7.2.5 “内容”文本输入域
该分类下的相关小册推荐:
Magento零基础到架构师(安装篇)
Workerman高性能框架-GatewayWorker
Magento零基础到架构师(系统管理)
Laravel(10.x)从入门到精通(一)
Workerman高性能Web框架-Webman
PHP8入门与项目实战(4)
Laravel(10.x)从入门到精通(八)
Laravel(10.x)从入门到精通(二)
PHP8入门与项目实战(1)
Magento中文全栈二次开发
Swoole入门教程
Laravel(10.x)从入门到精通(七)