这个是我的controller代码:
public static final int AVATAR_MAX_SIZE=10 * 1024 * 1024;
/**
* 限制上传文件的类型
*/
public static final List<String> AVATAR_TYPE=new ArrayList<>();
static {
AVATAR_TYPE.add("image/jpeg");
AVATAR_TYPE.add("image/png");
AVATAR_TYPE.add("image/bmp");
AVATAR_TYPE.add("image/gif");
}
/**
* MultipartFile接口是SpringMVC提供的一个接口,这个接口为我们包装了获取文件类型的数据
* (任何类型的file都可以接收),SpringBoot它又整合了SpringMVC,只需要在处理请求的方法
* 参数列表上声明一个参数类型为MultipartFile的参数,然后SpringBoot自动将的传递服务的文件数据复制给这个参数
*
* @RequestParam这个注解表示请求中的参数,将请求中的参数注入请求处理方法的某个参数上,
* 如果名称不一致则可以使用@RequestParam注解进行标记和映射
* @param session
* @param file
* @return
*/
@RequestMapping("change_avatar")
public JsonResult<String> changeAvatar( @RequestParam(value = "file") MultipartFile file,
HttpSession session){
//判断文件是否为null
if (file.isEmpty()){
throw new FileEmptyException("文件为空");
}
if (file.getSize() > AVATAR_MAX_SIZE){
throw new FileSizeException("文件超出限制");
}
//判断文件类型是否是我们规定的后缀类型
String contentType = file.getContentType();
//如果集合包含某个元素则返回true
if (!AVATAR_TYPE.contains(contentType)){
throw new FileTypeException("文件类型不支持");
}
//上传的文件.../upload/文件.png
String parent=session.getServletContext().getRealPath("upload");
//File对象指向这个路径,File是否存在
File dir=new File(parent);
if (!dir.exists()){ //检测目录是否存在
dir.mkdirs(); //创建当前的目录
}
//获取这个文件名称,UUID工具来将生成一个新的字符串作为文件名
//例如:avatar01.png
String originalFilename=file.getOriginalFilename();
System.out.println("OriginalFilename="+originalFilename);
int index=originalFilename.lastIndexOf(".");
String suffix=originalFilename.substring(index);
//
String filename= UUID.randomUUID().toString().toUpperCase()+suffix;
File dest=new File(dir,filename); //是一个空文件
//参数file中的数据写入到这个空文件中
try {
file.transferTo(dest); //将file文件中的数据写入到dest文件
} catch (FileStateException e) {
throw new FileStateException("文件状态异常");
} catch (IOException e) {
throw new FileUploadIOException("文件读写异常");
}
Integer uid =getuidFromSession(session);
String username = getUsernameFromSession(session);
//返回头像的路径/upload/test.png
String avatar="/upload/"+filename;
userService.changeAvatar(uid,avatar,username);
//返回用户头像的路径给前端页面,将来用于头像展示使用
return new JsonResult<>(OK,avatar);
}
<div class="modal fade" id="avatar-modal" aria-hidden="true" aria-labelledby="avatar-modal-label" role="dialog" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<!-- {%url('admin/upload-logo')%} -->
<form enctype="multipart/form-data" class="avatar-form" action="/user/change_avatar" method="post" id="form-change-avatar">
<div class="modal-header">
<button class="close" data-dismiss="modal" type="button">×</button>
<h4 class="modal-title" id="avatar-modal-label">Change Logo Picture</h4>
</div>
<div class="modal-body">
<div class="avatar-body">
<div class="avatar-upload">
<input class="avatar-src" name="avatar_src" type="hidden">
<input class="avatar-data" name="avatar_data" type="hidden">
<label for="avatarInput">图片上传</label>
<input class="avatar-input" id="avatarInput" name="file" type="file"></div>
<div class="row">
<div class="col-md-9">
<div class="avatar-wrapper"></div>
</div>
<div class="col-md-3">
<div class="avatar-preview preview-lg"></div>
<div class="avatar-preview preview-md"></div>
<div class="avatar-preview preview-sm"></div>
</div>
</div>
<div class="row avatar-btns">
<div class="col-md-9">
<div class="btn-group">
<button class="btn" data-method="rotate" data-option="-90" type="button" title="Rotate -90 degrees"><i class="fa fa-undo"></i> 向左旋转</button>
</div>
<div class="btn-group">
<button class="btn" data-method="rotate" data-option="90" type="button" title="Rotate 90 degrees"><i class="fa fa-repeat"></i> 向右旋转</button>
</div>
</div>
<div class="col-md-3">
<button class="btn btn-success btn-block avatar-save" type="button" id="btn-change-avatar"><i class="fa fa-save"></i> 上传</button>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="loading" aria-label="Loading" role="img" tabindex="-1"></div>
运行结果
接口参数中, @RequestParam(value = "file") 去掉试试。
https://blog.csdn.net/u013168084/article/details/107911335?utm_source=app&app_version=4.18.0
你这个是Post请求提交,后端方法最好声明一下post请求