2010-01-07 71 views
11

是的,我們的客戶想上傳多個文件。 我們使用spring 3 mvc。 官方示例是這樣的:spring 3上傳很多文件

標記:

<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"; 
    } 
} 

只有一個文件,這樣我就可以在該方法中寫入文件的輸入名稱。 但我應該怎麼做,如果我想上傳很多文件。 我無法編寫所有文件輸入名稱,因爲如果由js代碼生成。 我只知道它的名字像'attach_' 那麼,我該寫什麼方法?如果我寫這樣的

@RequestParam() MultipartFile file 

@RequestParam("attach_") MultipartFile file 

我會得到一個錯誤。

回答

10

我有它使用Spring 3.0.4工作(有春的早期版本中的一個問題,所以一定要使用> = 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> 
+0

我得到Http 400,使用你的代碼不好的請求,任何想法? – Wint 2014-02-08 09:25:46

+0

反對票,因爲它是不必要的複雜和蜘蛛的答案應該擁有最多的票 – Johannes 2016-07-05 17:38:04

8

一個更簡單的方法 - 工程我

/*** 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()))); 

} 
1

我發現清晰的使用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

+0

你也可以使用multipartRequest.getFileMap():) – 2017-08-11 14:11:34

0

您使用模型和形式。

(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. 
}