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

1 Base64格式效果

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

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

 

举例:

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

1eRe der 
U5pOXUecNNRmnmmCgSpqMoggVaQyM000400CmAOqcZxxTGNTVVbB7raW6CpNRtvs002/dYZäCiM7C06TikzPlyaMU05NOVGdsKMnOFNkRTexGaSUlOCC0701A3TZTiMOS 
spWMkfJX7JWrNoggn1FSSVVfulKLvuKmh 
KeejYcégcnkq9WIHyighU18VeXhRSATFJTjTTQA2kNopvWg80SGlNJ10GNxSHpTjTSKAMzV7S4urcC3YZUSKk43Vzy-Fbi710XGLdM8jlZvwxxXZ02spUoy

 

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

368 fadsfdasf 
fdasfasd 
wamkDB+NGhwbcaW63JOP07votU/JtOu8N 
UYo/wAsI/U2aV8xZK72Q

 

2 实现方式

2.1 前端表单代码

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

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

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

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

코響L혠0

 

<el-form-item label— 
< el-upload 
class= " avatar- uploader" 
action= " https : / /jsonplaceholder . typicode . com/posts/" 
: show-file-list= "false " 
: http-request="getImgStr" > 
<åmg v-if=" imagel_lrl" : src=" imagelJr1" class=" avatar" > 
v-else 
class="el-icon-plus avatar-uploader-icon" 
< / el-upload> 
< / el -form- item>

 

代码:

<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

 

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);
    }
},

提交方法:

getImgStr(e){ 
new FileReader(); 
var fileReader 
fileReader . readAsDataURL(e . file) ; 
fileReader . onload 
= e. target. result; 
this . formData . brandLogo 
e. target . result; 
* preturns 
async addEntity(){ 
await addEntity(this . formData) ; 
this . findpage(); 
data() { 
return { 
total: 0, //n 
tableData: 
searchParams: { 
currentPage: älJÄ 
pageSize: 5/ 
id: 0, 
imageUr1: ' 
batchlds: 
formData: {E 
dialogVisib1e : false 
< el - button 
< el - button 
" dialogVisib1e 
type—I' primary" @c1ick="dia10gVisib1e = " >ifi

 

: Object 
branaDesc. 
"data. 
"fen " 
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;
}
posted @ 2021-10-05 00:29  夏·舍  阅读(458)  评论(0编辑  收藏  举报