ssm框架结合Ajax实现图片上传功能

先上代码

一.html代码

<div>
    <img src="img/头像.png" alt="选择并上传头像" id="avatar_img" style="width: 100px;height: 100px;left:0;top: 0;"/>
    <input type="file" id="avatar_file" name="avatar_file"
           accept="image/jpg,image/png,image/gif"
           style="width: 100%;height: 100px;opacity: 0;position: absolute;left:0px;top: 0;"/>
</div>

二.js代码

// 头像预览
$("#avatar_file").change(function () {
    // 获取上传文件对象
    var file = $(this)[0].files[0];
    // 读取文件URL
    var reader = new FileReader();
    reader.readAsDataURL(file);
    // 阅读文件完成后触发的事件
    reader.onload = function () {
        // 读取的URL结果:this.result
        $("#avatar_img").attr("src", this.result);
        var formFile = new FormData();
        formFile.append("user_id",window.location.search.substr(1));
        formFile.append("file",file);
        
        var data = formFile;
        $.ajax({
            url : 'http://localhost:8080/addUserPicture',
            type : 'post',
            dataType : 'json',
            data : data,
            cache: false,   //上传文件无需缓存
            processData: false,   // 用于对参数进行序列化处理,这里必须设为false
            contentType:false, // 必须
            success : function(data) {
                console.log(data);
                 if (data.state == 200) {
                    alert("图片上传成功!")
                    
                }
                if(data.state == 300){
                    alert("图片上传失败!");
                    return;
                }
            },
        })
    }
})

    $.ajax({
        url:"http://localhost:8080/showUserPicture?user_id="+userid,
        type:"post",
        success:function(result){
            var src = "http://localhost:8080/"+result
            $("#avatar_img").attr("src",src);
        }
    })
    

三.后端代码

1.两个工具类

package com.bzw.util;

import java.io.Serializable;

/**
JsonResult工具类
* 用于封装服务器到客户端的Json返回值 * * @author soft01 * */ public class JsonResult<T> implements Serializable { // Serializable将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本 public static final int SUCCESS = 0; public static final int ERROR = 1; public static final int OTHER = 2; private int state; private String message = ""; private T data; private String pass = ""; public JsonResult() { state = SUCCESS; } // 为了方便,重载n个构造器 public JsonResult(int state, String message, T data) { super(); this.state = state; this.message = message; this.data = data; } public JsonResult(int state, String error) { this(state, error, null); } public JsonResult(int state, T data) { this(state, "", data); } public JsonResult(String error) { this(ERROR, error, null); } public JsonResult(T data) { this(SUCCESS, "", data); } public JsonResult(int state) { this(state, "", null); } public JsonResult(Throwable e) { this(ERROR, e.getMessage(), null); } public int getState() { return state; } public void setState(int state) { this.state = state; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; } public static int getSuccess() { return SUCCESS; } public static int getError() { return ERROR; } @Override public String toString() { return "JsonResult [state=" + state + ", message=" + message + ", pass=" + pass + ", data=" + data + "]"; } }


# UploadUtil工具类。使用UUID防止图片名称以及图片路径重复
package com.bzw.util;

import org.apache.commons.io.FilenameUtils;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

public class UploadUtil {

public static String imageUpload(@RequestParam(value="file") MultipartFile file, HttpServletRequest req){
// 获取要上传的目标位置,即是项目的upload文件夹所在的绝对路径
//如果添加了tomcat的虚拟映射路径,需要先新建一个upload文件夹
String path = req.getSession().getServletContext().getRealPath("upload");
// 获取文件的扩展名
String ext = FilenameUtils.getExtension(file.getOriginalFilename());
String filename = UUID.randomUUID().toString().replaceAll("-", "")+"."+ ext;
// 写入文件成功之后,返回的数据,也就是数据库里要存的文件的url
String src="upload/"+filename;
File targetFile= new File(path,filename);
try {
if(!targetFile.exists()){
//写入文件
file.transferTo(targetFile);
return src;
}
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();

}
//写入文件失败,则返回空字符串
return "";
}
}
 

2.controller

 @PostMapping("/addUserPicture")
    public JsonResult<String> insertPicture(@RequestParam(value = "file") MultipartFile pictureFile, HttpServletRequest request,@RequestParam(value = "user_id") int userid){
        // pictureURL是数据库里picture_url的值,这里用到一个封装的工具类UploadUtil
        String pictureURL = UploadUtil.imageUpload(pictureFile, request);
        System.out.println("pictureURL:" + pictureURL);
        //获取上传时的文件名
        String pictureName = FilenameUtils.getName(pictureFile.getOriginalFilename());
        System.out.println("pictureName:" + pictureName);
        // 把图片数据保存到数据库
        User user = new User();
        //暂时将user_tel,user_email存放图片名称和路径
        user.setUser_tel(pictureName);
        user.setUser_email(pictureURL);
        try {
            userService.updateUser(user,userid);
            return new JsonResult<>(200, "上传成功!", user.getUser_email());
        } catch (Exception e) {
            return new JsonResult<>(300, "上传失败", null);
        }
    }

    @PostMapping("/showUserPicture")
    public String showUserPicture(@RequestParam(value = "user_id") int userId){
        User user = new User();
        try {
             user = userService.selectUser(userId);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return user.getUser_email();
    }

值得注意的地方:

1.我使用的是IDEA,要在target目录下手动创建一个upload文件夹,否则会找不到文件路径。

2.前端访问图片路径是 服务器端口号+图片相对路径

参考博客:

https://blog.csdn.net/linmengmeng_1314/article/details/84944056

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值