【问题标题】:spring 3 upload many filesspring 3 上传很多文件
【发布时间】:2011-01-02 08:00:24
【问题描述】:

是的,我们的客户想要上传多个文件。 我们使用spring 3 mvc。 官方例子是这样的:

标记:

<form method="post" action="/form" enctype="multipart/form-data">
    <input type="text" name="name"/>
    <input type="file" name="file"/>
    <input type="submit"/>
</form>

代码:

@RequestMapping(value = "/form", method = RequestMethod.POST)
public String handleFormUpload(@RequestParam("name") String name,
                               @RequestParam("file") MultipartFile file) {

    if (!file.isEmpty()) {
        byte[] bytes = file.getBytes();

        // store the bytes somewhere
        return "redirect:uploadSuccess";
    } else {
        return "redirect:uploadFailure";
    }
}

只有一个文件,所以我可以在方法中写入文件输入名称。 但是如果我想上传很多文件我应该怎么做。 我无法编写所有文件输入名称,因为 if 是由 js 代码生成的。 我只知道它的名字像'attach_' 那么,我应该在方法中写什么?如果我这样写

@RequestParam() MultipartFile file

@RequestParam("attach_") MultipartFile file

我会得到一个错误。

【问题讨论】:

    标签: spring-mvc


    【解决方案1】:

    你使用模型和形式。

    (HTML/Jsp)

    <form id="uploadForm" method="POST"enctype="multipart/form-data/charset=UTF-8">
         //...multi file, add dynamic input
         <input type="file" name="file"/>
         <input type="file" name="file"/>
         <input type="file" name="file"/>
         <input type="file" name="file"/>
    </form>
    <input type="button" id="save_button" value="save" />
    

    (Js)

    var form = new FormData(document
            .getElementById('uploadForm'));
    
    $.ajax({
        url : "/test/upload/file,
        type : 'POST',
        dataType : 'text',
        data : form,
    
        processData : false,
        contentType : false,
    
        success : function(response) {
            if (response == "success") {
                document.location.reload(true);
    
            } else {
                $("#editMsg").text("fail");
            }
        },
        error : function(request, status, error) {
    
        }
    });
    

    (型号)

    public class fileModel {
       private List<MultipartFile> file; // this name = input name
    
      ... setter, getter
    }
    

    (控制器)

    @RequestMapping(value = "/upload/file", method = RequestMethod.POST)
    public @ResponseBody String uploadFiles(fileModel model, HttpServletRequest req) {
    
        return "success" // <-- debug. break point !! Your watch model. 
    }
    

    【讨论】:

      【解决方案2】:

      我发现使用 MultipartHttpServletRequest 对象作为控制器方法的参数更清晰:

      @RequestMapping(value = "/save", method=RequestMethod.POST)
      protected String save(Model model, MultipartHttpServletRequest multipartRequest) {
          MultipartFile file = multipartRequest.getFile("field-name");
          // Also multiple files with same name
          List<MultipartFile> files = multipartRequest.getFiles("multifield-name");
          // ...
      }
      

      文档链接:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart-resolver-commons

      【讨论】:

      • 你也可以使用 multipartRequest.getFileMap() :)
      【解决方案3】:

      更简单的方法 - 适合我

      /*** Upload Images ***/
      @RequestMapping(value = "/images/upload", method = RequestMethod.POST)
      public void upload(@RequestParam("file") List<MultipartFile> files, @RequestParam("user") String user) {
      
          files.forEach((file -> System.out.println(file.getOriginalFilename())));
      
      }
      

      【讨论】:

      【解决方案4】:

      我可以使用 Spring 3.0.4(以前版本的 Spring 存在问题,因此请务必使用 >= 3.0.4)。

      要对其进行测试,您可以使用以下步骤:

      public class MultiPartFileUploadBean {
      
          private List<MultipartFile> files;
      
          public void setFiles(List<MultipartFile> files) {
              this.files = files;
          }
      
          public List<MultipartFile> getFiles() {
              return files;
          }
      }
      

      控制器:

      @RequestMapping(value = "/uploadtest", method = RequestMethod.POST)
      public String uploadtestProcess(MultiPartFileUploadBean file, BindingResult bindingResult,
              Model model) throws IOException {
          ... // binding check
          StringBuilder sb = new StringBuilder();
          List<MultipartFile> files = file.getFiles();
          for(MultipartFile f:files)
              sb.append(String.format("File: %s, contains: %s<br/>\n",f.getOriginalFilename(),new String(f.getBytes())));
          String content = sb.toString();
          model.addAttribute("content", content);
          return "uploadtest";
      }
      

      jsp:

      <form method="post" action="/uploadtest" enctype="multipart/form-data">
      <p>Type: <input type="text" name="type" value="multiPartFileSingle" size="60" /></p>
      <p>File 1: <input type="file" name="files[0]" size="60" /></p>
      <p>File 2: <input type="file" name="files[1]" size="60" /></p>
      <p><input type="submit" value="Upload" /></p>
      </form>
      <c:if test="${not empty content}">
      <p>The content uploaded: <br/>${content}</p>
      

      【讨论】:

      • 我收到 Http 400,使用您的代码的错误请求,知道吗?
      • 投反对票,因为没有必要复杂,Spider 的回答应该获得最多票
      【解决方案5】:
      猜你喜欢
      • 1970-01-01
      • 2018-04-12
      • 2023-03-22
      • 1970-01-01
      • 2011-08-11
      • 2020-03-18
      • 2014-10-31
      • 2017-11-05
      • 2018-03-20
      相关资源
      最近更新 更多