功能描述:上传头像,以及更换头像,具体实施步骤如下:
1.页面代码
选择本地照片
上传文件
不超过2M的gif、jpg、png图片
照片预览
头像预览
2.js代码
var dataFuc = function dataFuc() {
return {
visible : false,
loading : false,
menuStyle:{
isUserInfo:false,
isImageSetting:true,
isActivendicator:false,
},
src: '',
limitNum: 1,
fileName: '',
param:'',//表单要提交的参数
}
};
var app = new Vue({
el : '#app',
data : dataFuc,
methods : {
changeUpload: changeUpload,
handleExceed: handleExceed,
onclick: onclick,
},
})
function onclick(){
var fileName = this.fileName;
var reader = new FileReader();
reader.readAsDataURL(this.param.raw);
reader.onload = function(e){
var data = this.result; // 这个就是base64编码了
$.ajax({
data : {image: data,fileName: fileName},
type : "POST",
url : contextRoot + 'user/saveImage',
async : false,
success : function(result) {
if (result.code == 200) {
console.log(result);
showMsg("图片上传成功");
}else {
app.$message.error(result.msg)
}
}
});
/* 此处停留1秒刷新页面 */
setTimeout(function(){
location.reload();
},1000)
}
}
function cancel(){
location. reload();
}
function changeUpload (file, fileList){
console.log(file);
// 判断图片大小
if (fileList[0].size < 2200000) {
// 判断图片格式是否为jpg,png,jepg,gif
var fileName=fileList[0].name;
var url = fileList[0].url;
var suffix = fileName.substring(fileName.lastIndexOf(".")+1).toUpperCase()
if (suffix=="JPG"||suffix=="JPEG"||suffix=="PNG"||suffix=="GIF") {
this.src=url;
this.fileName=fileName;
this.param=file;
} else {
this.$message.error('文件类型不正确,请重新上传!')
}
} else {
this.$message.error('图片大小超过2M,请重新上传')
}
}
// 文件超出个数限制时的钩子
function handleExceed(file, fileList){
this.$notify.warning({
title: '警告',
message: '只能选择一个文件!'
});
}
function showMsg(msg){
app.$message({
showClose: true,
message: msg,
type: 'success',
duration: 3000
});
}
3.java后台代码,
①上传图片,将base64位的图片信息解析出来之后,存入数据库中既是imagePath
@ResponseBody
@PostMapping(value = "/saveImage")
public BaseResponse saveImage(String image,String fileName,HttpServletRequest request){
BaseResponse result = new BaseResponse();
try {
//输出base64 数据,截取","之后的值进行转换
String str = image.substring(image.indexOf(",")+1);
//System.currentTimeMillis()意思是获取当前系统的时间戳给图片命名
//实例化Base64转换类 调用里面的GenerateImage方法(把base64数据转为图片)
//第一个参数base64转图片的必须的base64数据,第二个是转换后生成的图片存放路径
String imagePath = "E:/images/"+System.currentTimeMillis()+".png";
GenerateImage(str, imagePath);
//数据库存入绝对路径下的图片路径及名称(上传图片即是修改操作)
String loginUser = SessionHelper.GetLoginUserCode();
User user = userRepository.getByName(loginUser);
user.setImagePath(imagePath);
//更新用户头像地址
userRepository.updateImagePath(user);
result.code = 200;
} catch (Exception e) {
e.printStackTrace();
result.code = 500;
result.setMsg("服务器错误");
}
return result;
}
//base64字符串转化成图片
public static boolean GenerateImage(String imgStr,String imageName){
//对字节数组字符串进行Base64解码并生成图片
if (imgStr == null) //图像数据为空
return false;
try{
//Base64解码
byte[] b = Base64.decodeBase64(imgStr.replace("data:image/png;base64,",""));
imgStr = imgStr.replace("base64,","");
for(int i=0;i
②前端获取图片并展示,将路径放至需要展示图片地方即可;
@RequestMapping(value = "/showImg")
@ResponseBody
public void showImg( HttpServletRequest request,HttpServletResponse response) {
String loginUser = SessionHelper.GetLoginUserCode();
User user = userRepository.getByName(loginUser);
//查询当前登录用户图片地址
String pathName = userRepository.getImagePath(user.getUserCode());
File imgFile = new File(pathName);
FileInputStream fin = null;
OutputStream output=null;
try {
output = response.getOutputStream();
fin = new FileInputStream(imgFile);
byte[] arr = new byte[1024*10];
int n;
while((n=fin.read(arr))!= -1){
output.write(arr, 0, n);
}
output.flush();
output.close();
} catch (IOException e) {
e.printStackTrace();
}
至此头像上传和展示的所有代码完成;可直接使用。
参考博客:前端:https://blog.csdn.net/guaiguaiknl/article/details/53607483
后台:https://blog.csdn.net/qq_36410795/article/details/72652027?locationNum=8&fps=1