1、前端采用的是ajax进行提交(FormData)
$(document).ready(function () {
$("#submit").click(function () {
var title = $("#title").val();
var image = $("#image").val();
var desc = $("#desc").val();
var formData = new FormData();
formData.append("title",title);
formData.append("desc",desc);
formData.append("file",$("#image")[0].files[0]);
if('' == title || '' == image || '' == desc){
alert("请将相关信息填写完整!");
}else {
$.ajax({
url: "uploadPhoto",
type: "post",
data: formData,
contentType:false, // 不要设置Content-Type请求头
processData:false, // 使数据不做处理
success: function (result) {
if(result.result == '3000'){
window.alert("上传成功");
window.location.href="toUploadPage";
}else {
window.alert("系统错误,上传失败!请稍后再试。");
}
}
});
}
});
});
2、Controller
public final static String UPLOAD_PATH_PREFIX = "static/photos/";
/**
* 用户上传作品
* @param photo
* @param file
* @return
*/
@ResponseBody
@RequestMapping(value = "uploadPhoto",method = RequestMethod.POST)
public Map<String,String> uploadPhoto(PhotoEntity photo, MultipartFile file, HttpServletRequest request) {
//从session中获取当前用户信息
UserEntity user = (UserEntity) request.getSession().getAttribute("user");
String username = user.getUsername();
Integer uid = user.getId();
//上传图片
//设置文件名 UUID避免重复
String fileName = StringUtil.getUUID()+file.getOriginalFilename();
//当前项目的位置
String realPath = new String("src/main/resources/" + UPLOAD_PATH_PREFIX);
//如果当前不存在该路径就创建路径
File ph = new File(realPath);
if(!ph.exists()){
ph.mkdirs();
}
try {
File file1 = new File(ph.getAbsolutePath()+File.separator + fileName);
file.transferTo(file1);
} catch (IOException e) {
e.printStackTrace();
}
photo.setPath("photos/"+fileName);
photo.setUid(uid);
return photoService.uploadPhoto(photo);
}
在ssm项目中使用的方法
这里如果还是按照这种方式写上传可以成功,但是重启服务器后图片将无法访问。
按照第一种方式上传图片就已经实现了,但是图片上传后不能通过url访问,需要重新启动项目才能访问。这是因为对服务器的保护措施导致的,服务器不能对外部暴露真实的资源路径,需要配置虚拟路径映射访问。
具体配置方法如下:
@Configuration
public class PhotoConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/photos/**").addResourceLocations("file:D:\\IDEACode\\photography\\src\\main\\resources\\static\\photos\\");
}
}
addResourceHandler() 配置需要映射的文件夹
addResourceLocations() 配置文件夹在系统中的路径,要使用绝对路径