form提交后,post请求被重定向成了get请求

一个简单的springmvc实现的上传功能,主要代码如下

img

<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不会重定向,请求方式也不会变化)

img


img

上传文件的路径固定很正常,重名是什么意思?

难道你不知道 http://localhost:8080/ssmtest/ 就是访问你的WebContent目录吗?你在WebContent写一个index.jsp或者index.html,输入那个路径会直接访问得到的,你在后面加上upload他才会访问你的upload目录下,如果你WebContent没有这个目录,他才会去你的Controller里面去找对应的路径,所以说解决办法就是修改目录名即可,尽量保证controller和WebContent不重名,当然你也可以不用修改WebContent下的upload,你只要在controller类上面加一个RequestMapping注解路径就可以了,如图

img

你的表单提交路径也改一下即可,如 http://localhost:8080/ssmtest/ce/upload

加上: method = RequestMethod.POST,试试
@RequestMapping(value = "/upload", method = RequestMethod.POST)