4

我正在将 Java Web 应用程序转换为 Spring 框架,并感谢一些关于我在文件上传方面面临的问题的建议。原始代码是使用 org.apache.commons.fileupload 编写的。

  1. Spring MultipartFile 是否包装了 org.apache.commons.fileupload 或者我可以从我的 POM 文件中排除此依赖项?

  2. 我看过以下示例:

    @RequestMapping(value = "/form", method = RequestMethod.POST)
    public String handleFormUpload(@RequestParam("file") MultipartFile file) {
    
        if (!file.isEmpty()) {
            byte[] bytes = file.getBytes();
            // store the bytes somewhere
           return "redirect:uploadSuccess";
        } else {
            return "redirect:uploadFailure";
        }
    }
    

    最初我试图遵循这个例子,但总是得到一个错误,因为它找不到这个请求参数。所以,在我的控制器中,我做了以下事情:

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public @ResponseBody
    ExtResponse upload(HttpServletRequest request, HttpServletResponse response)
    {
       // Create a JSON response object.
       ExtResponse extResponse = new ExtResponse();
       try {
           if (request instanceof MultipartHttpServletRequest)
           {
               MultipartHttpServletRequest multipartRequest =
                            (MultipartHttpServletRequest) request;
               MultipartFile file = multipartRequest.getFiles("file");
               InputStream input = file.getInputStream();
               // do the input processing
               extResponse.setSuccess(true);
            }
        } catch (Exception e) {
            extResponse.setSuccess(false);
            extResponse.setMessage(e.getMessage());
        }
        return extResponse;
    }
    

它正在工作。如果有人能告诉我为什么@RequestParam 对我不起作用,我将不胜感激。顺便说一句,我确实有

    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="2097152"/>
    </bean>

在我的 servlet 上下文文件中。

4

6 回答 6

3

我不得不

  1. 将 commons-fileupload 依赖项添加到我的 pom 中,
  2. 添加 multipartResolver bean(在问题中提到),
  3. 在 handleFormUpload 方法中使用 @RequestParam("file") MultipartFile 文件和
  4. 在我的jsp中添加enctype:<form:form method="POST" action="/form" enctype="multipart/form-data" >

让它工作。

于 2013-11-12T22:43:30.340 回答
2
  1. spring 不依赖于 commons-fileupload,所以你需要它。如果它不存在,弹簧将使用其内部机制
  2. 您应该将 aMultipartFile作为方法参数传递,而不是@RequestParam(..)
于 2012-05-10T10:52:51.343 回答
1

这对我有用。

@RequestMapping(value = "upload.spr", method = RequestMethod.POST)
public ModelAndView upload(@RequestParam("file") MultipartFile file, HttpServletResponse response)
{
    //  handle file here
}
于 2013-01-10T15:25:19.160 回答
0

请求参数的通用语法是 @RequestParam(value="Your value", required=true),请求参数的模式用于从 Url 获取值。

于 2012-05-10T06:00:07.440 回答
0

在 Spring MVC 3.2 中引入了对 Servet 3.0 的支持。因此,如果您使用早期版本的 Spring,则需要包含 commons-file 上传。

于 2014-11-14T22:50:08.283 回答
0

在 POST 中,您只会在请求正文中发送参数,而不是在 URL 中(您使用@RequestParams)

这就是为什么您的第二种方法有效的原因。

于 2014-11-14T22:19:58.760 回答