spring如何上传文件?

Anu*_*ary 1 java spring servlets spring-mvc spring-web

我无法在 spring 控制器中获取文件名

<form:form method="post" modelAttribute="sampleDetails" 
 enctype="multipart/form-data">
    <input type="file" name="uploadedFileName" id="fileToUpload" required="" >
    <input type="submit" name="import_file" value="Import File" id="" />
</form:form>
Run Code Online (Sandbox Code Playgroud)

它是我在控制器中的 post 方法

@RequestMapping(method = RequestMethod.POST)
public String importQuestion(@Valid @RequestParam("uploadedFileName") 
MultipartFile multipart, @ModelAttribute("sampleDetails") SampleDocumentPojo sampleDocument,  BindingResult result, ModelMap model) {
    logger.debug("Post method of uploaded Questions ");

    logger.debug("Uploaded file Name : " + multipart.getName());
    return "importQuestion";
}
Run Code Online (Sandbox Code Playgroud)

提交后得到警告信息。

 warning [http-nio-8080-exec-9] WARN 
 org.springframework.web.servlet.PageNotFound - Request method 'POST' not 
 supported
 [http-nio-8080-exec-9] WARN 
 org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver 
 - Handler execution resulted in exception: Request method 'POST' not 
 supported
Run Code Online (Sandbox Code Playgroud)

Ame*_*bsa 6

在您的控制器中,您需要指定您期待 mutlipart

使用

consumes = {"multipart/form-data"}
Run Code Online (Sandbox Code Playgroud)

并使用 getOriginalFileName() 获取文件名

@RequestMapping(method = RequestMethod.POST, consumes = {"multipart/form-data"})
public String importQuestion(@Valid @RequestParam("uploadedFileName") 
MultipartFile multipart,  BindingResult result, ModelMap model) {
   logger.debug("Post method of uploaded Questions ");

    logger.debug("Uploaded file Name : " + multipart.getOriginalFilename());
   return "importQuestion";
}
Run Code Online (Sandbox Code Playgroud)

同样在您的 html 中,您输入的类型文件的名称应与 RequestParam“uploadedFileName”相同

     <input type="file" name="uploadFileName" id="fileToUpload" required="" >
Run Code Online (Sandbox Code Playgroud)

将其更改为

  <input type="file" name="uploadedFileName" id="fileToUpload" required="" >
Run Code Online (Sandbox Code Playgroud)


小智 6

您也可以使用 MutlipartFile 来上传文件,如下所示。

@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
 @ResponseBody
 public String uploadFile(@RequestParam("file") MultipartFile file) {

 try {

 String uploadDir = "/uploads/";
 String realPath = request.getServletContext().getRealPath(uploadDir);

 File transferFile = new File(realPath + "/" + file.getOriginalFilename()); 
 file.transferTo(transferFile);

 } catch (Exception e) {

 e.printStackTrace();

 return "Failure";
 }

 return "Success";
 }
Run Code Online (Sandbox Code Playgroud)

您不需要使用 spring 表单进行文件上传,您可以使用纯 HTML 来完成

<html>
<body>
 <h2>Spring MVC file upload using Annotation configuration Metadata</h2>

 Upload File :

 <form name="fileUpload" method="POST" action="uploadFile" enctype="multipart/form-data">
 <label>Select File</label> <br />
 <input type="file" name="file" />
 <input type="submit" name="submit" value="Upload" />
 </form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

您需要在您的应用程序配置中配置 MultipartResolver 对象,如下所示

@Bean(name="multipartResolver")
 public CommonsMultipartResolver multipartResolver() {
 CommonsMultipartResolver multi = new CommonsMultipartResolver();
 multi.setMaxUploadSize(100000);

 return multi;
 }
Run Code Online (Sandbox Code Playgroud)

您可以按照有关如何在 Spring MVC 框架中的 Spring 框架上传文件中上传文件的完整教程进行操作