图片上传预览
使用云盘存储路径<七牛云>
原理:点击上传图片时,访问接口使用七牛云的工具类把图片上传到七牛云空间,同时返回图片名称,上传成功后调用ElementUI的钩子函数,实现图片预览
缺点:会产生垃圾数据,要定时清理
<1>上传文件时的前端页面ElementUI
提示更改:action="****"
<el-row>
<el-col :span="24">
<el-form-item label="上传图片">
<el-upload
class="avatar-uploader"//样式
action="****"//上传时的访问Controller路径--/xxxxx/upload.do
:auto-upload="autoUpload"//是否自动上传--true
name="imgFile"//图片名字imgFile
:show-file-list="false"//是否展示上传列表
:on-success="handleAvatarSuccess"//上传成功执行的方法
:before-upload="beforeAvatarUpload">//上传前可以校验是否合格
//判断图片访问地址imageUrl是否为null
<img v-if="imageUrl" :src="imageUrl" class="avatar">//!=null
<i v-else class="el-icon-plus avatar-uploader-icon"></i>//==null
</el-upload>
</el-form-item>
</el-col>
</el-row>
<2>js–Vue
提示更改:el: ‘#***’,this.imageUrl="<协议>–<域名>"+response.data;
var vue = new Vue({
el: '#***',
data: {
autoUpload:true
imageUrl: null,//模型数据,用于上传图片完成后图片预览,初始值为null
formData: {},//需要提交的表单数据
},
methods: {
//文件上传成功后的钩子,response为服务端返回的值,file为当前上传的文件封装成的js对象
handleAvatarSuccess(file,filesList) {
//访问路径路径可变---域名+文件名称
this.imageUrl="<协议>--<域名>"+response.data;
this.$message({
type:response.flag?"success":"error",
message:response.message
})
//给formData对象添加属性,传输图片名称
this.formData.img=response.data
},
//上传图片之前执行
beforeAvatarUpload(file) {
const isJPG = file.type === 'image/jpeg';
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isJPG) {
this.$message.error('上传套餐图片只能是 JPG 格式!');
}
if (!isLt2M) {
this.$message.error('上传套餐图片大小不能超过 2MB!');
}
return isJPG && isLt2M;
},
}
})
<3>后端上传图片
@RequestMapping("/upload")
//(@RequestParam("****)前端文件提交时的name属性和后端MultipartFile参数名不同时必须添加此属性(***)为前端文件的name值,此处可以不添加
//Result是一个--被序列化--的实体类用来--封装返回结果
//MultipartFile 这个类一般是用来接受前台传过来的文件
public Result upload(@RequestParam("imgFile") MultipartFile imgFile) {
try {
//获取文件名 MultipartFile 的API
String originalFilename = imgFile.getOriginalFilename();
//获取最后一个·所在位置的索引
int lastIndexOf = originalFilename.lastIndexOf(".");
//返回一个新字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。
String suffix = originalFilename.substring(lastIndexOf);
//使用UUID
String fileName = UUID.randomUUID().toString() + suffix;
//使用七牛云的工具类,上传文件
QiniuUtils.upload2Qiniu(imgFile.getBytes(), fileName);
//把生成的图片名称存储到Redis中
jedisPool.getResource().sadd(RedisConstant.SETMEAL_PIC_RESOURCES,fileName);
//页面回显fileName用来和域名结合实现图片预览
return new Result(true, MessageConstant.PIC_UPLOAD_SUCCESS, fileName);
} catch (IOException e) {
e.printStackTrace();
return new Result(false, MessageConstant.PIC_UPLOAD_FAIL);
}
}
<4>七牛云和Redis定时清理使用详见下一篇
创建临时的路径来展示图片
原理:点击上传图片时,访问接口直接把图片存储到本地磁盘,同时返回图片名称,上传成功后调用ElementUI的钩子函数,实现图片预览
<1>上传文件时的前端页面ElementUI
<el-row>
<el-col :span="24">
<el-form-item label="上传图片">
<el-upload
class="avatar-uploader"
action=""//上传后不需要去存储
:auto-upload="autoUpload"//是否自动上传--false
name="imgFile"//图片传输的名字
:show-file-list="false"//是否展示上传列表
:on-change="onchange"//图片上传成功或者失败都会执行
:before-upload="beforeAvatarUpload">//上传前可以校验是否合格
//判断图片访问地址imageUrl是否为null
<img v-if="imageUrl" :src="imageUrl" class="avatar">//!=null
<i v-else class="el-icon-plus avatar-uploader-icon"></i>//==null
</el-upload>
</el-form-item>
</el-col>
</el-row>
<2>js–Vue
提示更改:el: ‘#***’
创建临时的路径来展示图片获取文件名称拼接图片预览路径
FormData类型其实是在XMLHttpRequest 2级定义的,它是为序列化表以及创建与表单格式相同的数据(当然是用于XHR传输)提供便利。
方法源码:append(name: string, value: string | Blob, fileName?: string): void;
Blob(Binary Large Object)术语最初来自数据库(oracle 中也有类似的栏位类型。),早期数据库因为要存储声音、图片、以及可执行程序等二进制数据对象所以给该类对象取名为Blob。
var vue = new Vue({
el: '#***',
data: {
autoUpload: false,//自动上传
imageUrl: null,//模型数据,用于上传图片完成后图片预览
param:"",//
formData: {},//表单数据
},
methods: {
//文件上传成功后的钩子,response为服务端返回的值,file为当前上传的文件封装成的js对象
onchange(file,filesList) {
//获取window.URL对象
var windowURL = window.URL || window.webkitURL;
//创建临时的路径来展示图片获取文件名称拼接图片预览路径
this.imageUrl=windowURL.createObjectURL(file.raw);
this.param=new FormData();
this.param.append('file', file.raw, file.name);
},
//上传图片之前执行
beforeAvatarUpload(file) {
const isJPG = file.type === 'image/jpeg';
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isJPG) {
this.$message.error('上传套餐图片只能是 JPG 格式!');
}
if (!isLt2M) {
this.$message.error('上传套餐图片大小不能超过 2MB!');
}
return isJPG && isLt2M;
},
//添加
handleAdd () {
//指定表单类型
let config = {
headers: {
'Content-Type': 'multipart/form-data'
}
};
//添加表单数据
this.param.append("name",this.formData.name);
this.param.append("code",this.formData.code);
.....
axios.post("/*****/add1.do?Ids=" + this.Ids,this.param,config).then((res)=>{
this.dialogFormVisible=false;
if(res.data.flag){
this.$message({
type:'success',
message:res.data.message
})
} else{
this.$message.error(res.data.message);
}
})
}
}
})
<3>后端代码实现
@RequestMapping("/add1")
public Result add1(Setmeal setmeal,Integer [] Ids,@RequestParam("file")MultipartFile imgFile) throws IOException {
//获取文件初始名称
String originalFilename = imgFile.getOriginalFilename ();
//本地存储,地址可换
imgFile.transferTo ( new File ( "E:\\temp\\" + originalFilename ) );
try {
//返回结果
return new Result ( true, MessageConstant.ADD_***_SUCCESS );
} catch (Exception e) {
e.printStackTrace ();
return new Result ( false, MessageConstant.ADD_****_FAIL );
}
}