通过 Laravel + Vue 实现文件上传功能


我们在前面的教程中已经实现了多个表单的提交功能,如新增咖啡店、编辑用户个人信息等,但是还没有涉及到文件上传,那么在这篇教程中我们将基于 Laravel + Vue 在新增咖啡店页面实现咖啡店图片上传。

第一步:创建存储文件表

首先我们创建一张数据表 cafes_photos 来存储上传的咖啡店图片:

编辑新生成的数据库迁移文件:

然后运行数据库迁移命令创建数据表:

第二步:在模型类中定义关联关系

接下来为新生成的数据表创建模型类 CafePhoto

编辑新生成的模型类 app/Models/CafePhoto.php,定义关联关系方法,咖啡店和用户与咖啡店图片都是一对多的关系:

相对的,在模型类 app/Models/Cafe.php 中定义咖啡店与图片的关联关系:

在模型类 app/User.php 中定义用户与咖啡店图片之间的关系:

第三步:创建图片存放目录

storage/app/public 目录下创建 photos 目录用于存放上传的咖啡店图片。

第四步:调整前端添加咖啡店 API 调用方法

接下来在 resources/assets/js/api/cafe.js 中修改 postAddNewCafe 方法,新增 picture 参数,并且为 axios.post 添加第三个参数用于标识请求头,这样就可以上传文件了:

第五步:更新 Vuex Action 传递图片参数

在 Vuex 模块 resources/assets/js/modules/cafes.js 中修改 addCafe Action 传递 data.picture 参数到上一步修改的 postAddNewCafe 方法:

第六步:更新新增咖啡店表单允许上传图片

最后我们需要修改新增咖啡店组件 resources/assets/js/pages/NewCafe.vue,在模板中「简介」输入字段后面加上图片上传代码:

然后在 methods 中定义 handleFileUpload 方法:

最后还要修改表单提交方法 submitNewCafe,新增 picture 字段:

以及 clearForm 方法在清空表单时清除上传图片:

至此,前端代码调整已经完成了,接下来修改后端控制器方法。

第七步:修改后端 API 处理图片上传

打开控制器文件 app/Http/Controllers/API/CafesController.php,在 postNewCafe 方法中 $parentCafe->save(); 保存咖啡店之后插入如下代码,用于从请求实例中获取上传图片并将其保存到 $destinationPath 目录下,同时保存记录到 cafes_photos 表:

至此,上传图片前后端链路已经打通,运行 npm run dev 重新编译前端资源,在新增咖啡店页面 http://roast.test/#/cafes/new 就可以看到文件上传控件了:

新增带图片的咖啡店就可以在数据库中看到对应的图片记录,也可以在 storage/app/public/photos 目录下看到上传的图片。


<< 上一篇: 实现用户个人信息编辑功能

>> 下一篇: 功能模块重构 & CSS 整体优化:首页篇