2013-02-17 40 views
12

Tôi đang cố tải lên nhiều tệp bằng cách sử dụng spring 3.1.2 với @Controller và @RequestMapping.Tải lên nhiều tệp Spring MVC với nhiều tính năng dạng tệp HTML5

Đây là những gì tôi đã làm và cấu hình của tôi.

dạng Html5:

<form action="addFileSystemImage.foo" method="post" enctype="multipart/form-data"> 

    <input class='fileInput' type="file" name="files[]" multiple="multiple" /> 

    <input type="text" value="13asdf12eadsf" name="locId"/> 

    <input type="submit" /> 

</form> 

điều khiển phương pháp:

@RequestMapping(value="/publisher/addFileSystemImage.foo", method=RequestMethod.POST) 
public @ResponseBody List<UploadedFile> addFileSystemImage(@RequestParam("files[]") ArrayList<MultipartFile> files, String locId, HttpServletRequest request) { 

//do lotsa voodoo rocket science here to process the files 

} 

conf của tôi:

<mvc:annotation-driven /> 
<context:component-scan base-package="foo.package"></context:component-scan> 
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean> 

Nộp theo hình thức không đến được với các phương pháp addFileSystemImage. Dữ liệu cho đối số locId ở đây, nhưng đối số "tệp" không bị ràng buộc. Nó có hệ thống null không có vấn đề gì kết hợp của các đối số/tên trường/loại đối số tôi đã thử.

Đối số HttpServletRequest là org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest và nó giữ thuộc tính multiPartFile thực sự chứa dữ liệu tệp. Nhìn vào giá trị của nó trong debug mang lại cho tôi

{files[]=[[email protected]6afd7f9, [email protected]28c2811, [email protected]f9aaed7]} 

có nghĩa là tập tin của tôi [] là thực sự ở đây ... nhưng bằng cách nào đó nó đã không vượt qua được dữ liệu ràng buộc bước đúng ...

Bây giờ ... Tôi biết bạn sẽ cho tôi biết tôi có thể lấy dữ liệu từ yêu cầu ... nhưng tôi muốn làm việc này đúng cách ... Sring cách ... :) và có ArrayList của tôi của MultipartFile đúng dân cư.

Tôi có thiếu gì đó không? Có ai thực sự thực hiện công việc này đúng không? Những gì tôi có thể làm để có ArrayList này (hoặc thậm chí một Array thường xuyên) dân cư?

Tôi đã vượt qua giải pháp này Spring MVC with ajax file upload and MultipartFile có nhiều điều tương tự như tôi nhưng rõ ràng là tôi phải làm điều gì đó sai vì giải pháp này không hoạt động đối với tôi.

Lưu ý: Tôi đã cố gắng làm cho nó hoạt động với các tệp tải lên một lần. Nhưng thách thức của tôi ngày hôm nay là để có được nhiều tập tin cùng một lúc.

Bất kỳ trợ giúp nào được đánh giá cao.

Xin cảm ơn trước.

+9

Bạn có cố gắng khai báo đối số "tệp" dưới dạng tệp Danh sách hoặc Multipart [] không? Tôi không nghĩ rằng danh sách sao lưu mùa xuân là một ArrayList và có thể các diễn viên thất bại khi mùa xuân cố gắng để ràng buộc các đối số phương pháp. –

+0

Tôi đã xoay xở để có được những thứ như thế này trong quá khứ. Tôi nhớ bạn cũng phải bao gồm phụ thuộc vào tải lên của tệp commons trong pom của bạn. Có thể thử điều đó? – gerrytan

+0

Ngu ngốc tôi ... Nó đã làm việc với Danh sách và Mảng ... Tôi chắc chắn đã mất dấu những gì tôi đã làm trong suốt quá trình thử nghiệm ... Cảm ơn Alex. Bạn có thể trả lời câu hỏi và tôi sẽ cung cấp cho bạn điểm nếu bạn muốn. Chúc mừng! – azpublic

Trả lời

0

Đã bao gồm phụ thuộc vào tải lên tệp phụ thuộc không?

<dependency> 
    <groupId>commons-fileupload</groupId> 
    <artifactId>commons-fileupload</artifactId> 
    <version>1.3</version> 
</dependency> 

Tôi đã thử nghiệm FileUpload hoạt động tốt ngay cả với ArrayList như các loại thông số trên bộ xử lý điều khiển

5

Mặc dù bạn đã nhận được câu trả lời nhờ bạn để Alex, tôi chỉ muốn xây dựng một chút. Với Spring binding, các trường biểu mẫu được ràng buộc với các thuộc tính "name" của chúng trong HTML. Vì không thể có trường biểu mẫu được đặt tên tệp [] (nếu một tên khai báo tên biến với cú pháp đó, tên của nó là tệp, nhưng nó là một mảng của loại khai báo), Spring không thể khớp với nó - và hành vi trong trường hợp đó là bỏ qua dữ liệu trong yêu cầu.

Sử dụng một loại như MultipartFile, bạn có thể sử dụng một danh sách tên là "tác phẩm" hoặc một mảng như các ví dụ sau:

private List<MultipartFile> files; 
private MultipartFile[] files; 

Với getter và setter thích hợp, bạn có thể sau đó truy cập và biến đổi các tập tin danh sách cho phù hợp.

Các vấn đề liên quan