2010-01-07 11 views
11

Ja, unser Kunde möchte mehr als eine Datei hochladen. wir verwenden Feder 3 mvc. die offizielle Beispiel wie folgt aus:spring 3 viele Dateien hochladen

Markup:

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

Code:

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

gibt es nur eine Datei, also kann ich die Datei Eingangsnamen in der Methode schreiben. aber was soll ich tun, wenn ich viele Dateien hochladen möchte. Ich konnte nicht alle Dateieingangsnamen schreiben, weil wenn der JS-Code generiert wird. ich weiß nur, dass sein Name wie 'attach_' dann, was soll ich in der Methode schreiben? wenn ich so

@RequestParam() MultipartFile file 

oder

@RequestParam("attach_") MultipartFile file 

schreiben werde ich einen Fehler.

Antwort

10

ich habe die Arbeit mit Frühling 3.0.4 (es gab ein Problem in früheren Versionen von Spring, so sicher sein,> = 3.0.4 verwenden) .

es zu testen, können Sie die folgenden Schritte aus:

public class MultiPartFileUploadBean { 

    private List<MultipartFile> files; 

    public void setFiles(List<MultipartFile> files) { 
     this.files = files; 
    } 

    public List<MultipartFile> getFiles() { 
     return files; 
    } 
} 

Der Controller:

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

Die 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

Ich bekomme Http 400, schlechte Anfrage mit Ihrem Code, irgendeine Idee? – Wint

+0

down-vote, weil es unnötig kompliziert ist und Spiders Antwort die meisten Stimmen haben sollte – Johannes

8

Eine viel einfachere Art und Weise - arbeitet für mich

/*** 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

fand ich klarer das MultipartHttpServletRequest Objekt als Parameter an die Controller-Methode zu verwenden:

@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"); 
    // ... 
} 

Link zu der Dokumentation: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart-resolver-commons

+0

Sie können auch multipartRequest.getFileMap() verwenden :) –

0

Sie verwenden Modell und Form.

(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) { 

    } 
}); 

(Modell)

public class fileModel { 
    private List<MultipartFile> file; // this name = input name 

    ... setter, getter 
} 

(Regler)

@RequestMapping(value = "/upload/file", method = RequestMethod.POST) 
public @ResponseBody String uploadFiles(fileModel model, HttpServletRequest req) { 

    return "success" // <-- debug. break point !! Your watch model. 
}