VUE+ElementUI+springboot Base64格式的文件上传

1 Base64格式效果

前端上传一个文件,一般都是考虑把文件传到服务器的某个位置保存,后端数据库存这个文件在服务器上的绝对路径

但是也可以让前端将文件基于Base64格式转为纯字符串,后端数据库直接存这串字符串

 

举例:

前端以Base64格式将一张图片转为字符串,前端控制台打印如下

VUE+ElementUI+springboot Base64格式的文件上传

 

此时后端数据库将这串字符串存在数据库表里

VUE+ElementUI+springboot Base64格式的文件上传

 

2 实现方式

2.1 前端表单代码

前端基于VUE+ElemetnUI,在ElementUI提供的表单上传的代码上,有几个关键点

①通过:http-request指定自定义的上传方式

②通过<img v-if="imageUrl" :src="imageUrl" class="avatar"> 给了一个自定义的变量imageUrl 用作上传图片回显的依据

如图:用户指定文件后,图片会直接被显示在表单中

VUE+ElementUI+springboot Base64格式的文件上传

 

VUE+ElementUI+springboot Base64格式的文件上传

 

代码:

<el-form-item label="品牌LoGo">
    <el-upload
            class="avatar-uploader"
            action="https://jsonplaceholder.typicode.com/posts/"
            :show-file-list="false"
            :http-request="getImgStr">
        <img v-if="imageUrl" :src="imageUrl" class="avatar">
        <i v-else class="el-icon-plus avatar-uploader-icon"></i>
    </el-upload>
</el-form-item>

 

2.2 前端布局样式

布局的样式如图,具体代码见ElementUI官方,毕竟本篇文章只是修改了文件上传方式,界面显示效果依然沿用ElementUI

VUE+ElementUI+springboot Base64格式的文件上传

 

2.3 JS代码

重写的上传方式被命名为getImgStr(本篇文章用图片作为上传文件)

①注意方法的参数表有个自定义的e 这个参数名可以自定义 总之要有 这代表传入的文件

②e.target.result可以获得上传的文件的Base64格式的字符串,将这个字符串传给imageUrl属性,此时页面就会回显用户提交的图片

③e.target.result还给到了this.formData属性,当用户点击表单的“确定”按钮时,表单就会执行提交

 

自定义上传方式的方法:

getImgStr(e){
    console.log(e);
    let fileReader = new FileReader();
    fileReader.readAsDataURL(e.file);
    fileReader.onload = e=> {
        this.imageUrl= e.target.result;
        this.formData.brandLogo = e.target.result;
        //console.log(e.target.result);
    }
},

提交方法:

VUE+ElementUI+springboot Base64格式的文件上传

 

VUE+ElementUI+springboot Base64格式的文件上传

 

2.4 JS代码 封装版

单独写一个js,保存方法并导出为对象

let base ={
    getBase64Str(file){
        return new Promise(resolve => {
            let fileReader= new FileReader();
            fileReader.readAsDataURL(file);
            fileReader.onload=e=>{
                resolve(e.target.result) ;
            }
        })
    }
}
export default base;

原JS引用

async getImgStr(e) {
    //回写显示
    this.imageUrl = await base64.getBase64Str(e.file);
    //给formdata赋值
    this.formData.brandLogo = this.imageUrl;
    console.log(this.formData.brandLogo)
    console.log(this.imageUrl)
}

 

3 后端

3.1 controller

代码很简单,给出注解,使用@RequestBody封装数据到对象中(由jackson提供的注解,将json字符串转对象,springMVC默认支持这种功能)

AxiosResult是一个自定义的封装,将返回的data和预设好的状态码、message一起返回给前端

/**
 * 新增
 * @param brand
 * @return
 */
@PostMapping
public AxiosResult<Void> add(@RequestBody BrandH brand){
    return toAxios(brandService.save(brand));
}

 

3.2 entity

代码很简单,就是前端传递的数据,可以看到品牌LOGO的数据类型为String 因为前端传过来的就是Base64格式的字符串

@Data
@EqualsAndHashCode(callSuper = false)
@TableName("brand")
public class BrandH extends BaseEntity {
    /**
     * 品牌名称
     */
    private String brandName;
    /**
     * 品牌描述
     */
    private String brandDesc;
    /**
     * 品牌LOGO
     */
    private String brandLogo;
    /**
     * 品牌官网
     */
    private String brandSite;
}
上一篇:Java学习笔记——IO流


下一篇:java IO操作