2010-01-07 47 views
11

vâng, khách hàng của chúng tôi muốn tải lên nhiều tệp. chúng tôi sử dụng spring 3 mvc. ví dụ chính thức như thế này:spring 3 tải lên nhiều tệp

đánh dấu:

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

mã:

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

chỉ có một tập tin, vì vậy tôi có thể viết tên đầu vào tập tin trong phương pháp này. nhưng tôi nên làm gì nếu tôi muốn tải lên nhiều tệp. tôi không thể viết tất cả các tên tệp nhập vì nếu được tạo bởi mã js. tôi chỉ biết rằng tên của nó như 'attach_' sau đó, tôi nên viết gì trong phương pháp? nếu tôi viết như thế này

@RequestParam() MultipartFile file 

hoặc

@RequestParam("attach_") MultipartFile file 

tôi sẽ nhận được một lỗi.

Trả lời

10

Tôi có nó làm việc với mùa xuân 3.0.4 (đã xảy ra lỗi trong phiên bản trước của mùa xuân, vì vậy hãy chắc chắn để sử dụng> = 3.0.4) .

Để kiểm tra, bạn có thể sử dụng các bước sau:

public class MultiPartFileUploadBean { 

    private List<MultipartFile> files; 

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

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

Bộ điều khiển:

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

Các 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

Tôi nhận được Http 400, yêu cầu xấu bằng cách sử dụng mã của bạn, bất kỳ ý tưởng? – Wint

+0

xuống phiếu bầu, bởi vì nó là không cần thiết phức tạp và câu trả lời của Spider nên có nhiều phiếu nhất – Johannes

8

Một cách đơn giản hơn nhiều - làm việc cho tôi

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

tôi thấy rõ ràng hơn để sử dụng đối tượng MultipartHttpServletRequest như một tham số cho phương thức điều khiển:

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

Liên kết đến các tài liệu: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart-resolver-commons

+0

Bạn cũng có thể sử dụng multipartRequest.getFileMap() :) –

0

Bạn sử dụng mô hình và hình thức.

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

    } 
}); 

(Mẫu)

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

    ... setter, getter 
} 

(điều khiển)

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

    return "success" // <-- debug. break point !! Your watch model. 
} 
Các vấn đề liên quan