一个简单的springmvc实现的上传功能,主要代码如下
<form action="<%=contextPath%>/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit" value="上传"/>
</form>
@RequestMapping("/upload")
public String uploadFile(HttpServletRequest request, Model model, MultipartFile
file) throws Exception {
String orginalname = file.getOriginalFilename();
String newfilename = UUID.randomUUID() +
orginalname.substring(orginalname.indexOf("."));
String path =
request.getSession().getServletContext().getRealPath("/upload");
System.out.println("path: " + path);
file.transferTo(new File(path + "/" + newfilename));
model.addAttribute("image", newfilename);
model.addAttribute("message", "上传成功! ");
return "success";
}
工程ssmtest下有upload目录,请求路径 http://localhost:8080/ssmtest/upload的时候,请求会被重定向为http://localhost:8080/ssmtest/upload/, POST请求方法也变成了GET方法,直接导致本来通过post方式传到后端的MultipartFile对象,变成get方式后直接丢失了,后端获取不到MultipartFile对象了,请大牛解惑,不甚感谢。(只有目录跟请求路径重名才会这样,目录名改掉后,/upload不会重定向,请求方式也不会变化)
上传文件的路径固定很正常,重名是什么意思?
难道你不知道 http://localhost:8080/ssmtest/ 就是访问你的WebContent目录吗?你在WebContent写一个index.jsp或者index.html,输入那个路径会直接访问得到的,你在后面加上upload他才会访问你的upload目录下,如果你WebContent没有这个目录,他才会去你的Controller里面去找对应的路径,所以说解决办法就是修改目录名即可,尽量保证controller和WebContent不重名,当然你也可以不用修改WebContent下的upload,你只要在controller类上面加一个RequestMapping注解路径就可以了,如图
你的表单提交路径也改一下即可,如 http://localhost:8080/ssmtest/ce/upload
加上: method = RequestMethod.POST,试试
@RequestMapping(value = "/upload", method = RequestMethod.POST)