背景:在项目中遇到一个新增、编辑的场景。新增一个车辆信息,并且附有车辆照片和关联的设备照片,照片转码成base64保存到mysql数据库。前端使用的是elementUi的upload组件,在前端把图片转成base64再传到后端。
前端代码如下:
<el-upload ref="carUpload":action="doUpload":file-list="carPictureList" list-type="picture-card":limit=limitNum:auto-upload="true":on-change="changeCarPicture":on-exceed="handleExceed":before-upload="beforeUpload"><iclass="el-icon-plus"></i></el-upload>
直接上代码:
data(){return{ doUpload:this.$http.adornUrl('/sys/dept/upload'), carPictureList:[], limitNum:1, carPicture:''//定义一个值来接收base64的字符串}}, methods:{changeCarPicture(file, fileList){// 图片转成base64上传 let reader=newFileReader(); reader.onload=()=>{ let _base64= reader.result; let BASE64= _base64.split(",");this.carPicture= BASE64[1];//赋值}; reader.readAsDataURL(file.raw);},handleExceed(files, fileList){//这个是文件超出个数限制时,给出提示this.$notify.warning({ title:'警告', message:'图片只能上传一张'})},beforeUpload(file){//添加文件类型的限制 let types=['image/jpeg','image/jpg','image/png'];const isImage= types.includes(file.type);if(!isImage){this.$message.error('上传图片只能是 JPG、JPEG、PNG 格式!');returnfalse;}},}
给大家看一下action绑定的doUpload: this.$http.adornUrl(’/sys/dept/upload’),这个接口
/** * 上传文件 */@PostMapping("/upload")public Rupload(@RequestParam("file") MultipartFile file)throws Exception{//上传文件 String suffix= file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));byte[] data= file.getBytes();return R.ok().put("data", data);}
保证这个接口能用就行。
剩下的就很简单了,图片已经转成base64字符串保存在carPicture了,把这个字符串传到后台进行保存就行了。要传其他照片也是一样,多写一个upload,转成base64,换一个值保存,对于后端接口来说,它就是一个String类型的数据。
顺带提一下,mysql保存base64是用longblob字段类型,在你保存这种数据时,可能会因为数据量过大而报错,可以上网查看相应的解决办法,增加max_allowed_packet。
接下来来说一下图片回显
很简单!
首先,根据你的接口查询到相应得数据,然后
let carMap={}; carMap["name"]='车辆照片'; carMap["url"]="data:image/png;base64,"+ carPicture;this.carPictureList.push(carMap);
carPicture 为你后端查询的图片base64字符串
carPictureList是你绑定在upload上的那个文件列表
这样你的图片就能回显在页面上了。