Đây là những gì tôi đang làm. Tôi muốn tải lên tệp nhiều phần thông qua Ajax vào ứng dụng web mùa xuân của tôi. Khi máy chủ nhận được yêu cầu POST, nó sẽ tạo một số vé trong cơ sở dữ liệu. Sau đó, nó bắt đầu một chuỗi xử lý việc tải tệp lên thực tế. Máy chủ sau đó trả về số vé.Tải lên tệp không đồng bộ trong Spring
Tôi đang sử dụng CommonsMultipartResolver để xử lý yêu cầu và tôi đã đặt cờ resolveLazily thành true để Multipart không được giải quyết ngay lập tức.
Vì vậy, đây là một cái gì đó dọc theo dòng của những gì tôi có
@Controller
public class myController{
@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
@ResponseBody
public String upload(MultipartHttpServletRequest request, String fileName){
String ticket = dao.createUploadTicket(fileName);
Runnable run = new Runnable(){
@Override
public void run(){
dao.writeUpdate(ticket, "Getting data from request");
final MultipartFile file = request.getFile("theFile");
dao.writeUpdate(ticket, "Multipart file processed");
try {
dao.writeUpdate(ticket, "Saving file to disk");
file.transferTo(new File("/myDirectory"));
dao.writeUpdate(ticket, "File saved to disk");
}
catch(Exception e){
dao.writeUpdate(ticket, "File upload failed with the exception " + e.toString());
}
}
};
Thread t = new Thread(run);
t.start();
return ticket;
}
}
Vì vậy, các điểm ở đây là số lượng vé có thể được sử dụng để có được những thông tin cập nhật tiến độ. Giả sử một tệp lớn đang được tải lên. Khách hàng đã thực hiện tải lên tệp POST (ví dụ trong trường hợp này là một yêu cầu Ajax) có thể làm điều đó một cách không đồng bộ và lấy lại một số vé. Khách hàng có thể sử dụng số vé đó để xác định giai đoạn tải lên tệp và hiển thị thông tin trong một trang khác.
Một cách sử dụng khác là tôi có thể có trang HTML yêu cầu máy chủ cho tất cả số vé, sau đó hiển thị chế độ xem "trực tiếp" của tất cả các tệp tải lên đang diễn ra trên máy chủ.
Tôi chưa thể làm việc này vì ngay sau khi bộ điều khiển trả về, Spring gọi cleanupMultipart() trong CommonsMultipartResolver. Vì cờ resolveLazily được đặt thành false, khi cleanupMultipart() được gọi, nó sẽ bắt đầu giải quyết và khởi tạo các tệp nhiều phần. Điều này dẫn đến tình trạng cuộc đua giữa lời gọi đến "request.getFile (" theFile ");" trong runnable và cuộc gọi cleanupMultipart() cuối cùng dẫn đến một ngoại lệ.
Bất kỳ ai có ý tưởng nào? Tôi đang phá vỡ một số loại hợp đồng HTTP ở đây bằng cách muốn làm back-end xử lý tập tin không đồng bộ.
Nhận xét về bài viết của riêng tôi. Tôi tìm thấy các blog sau đây có thể giúp đưa ra một giải pháp. http://blog.springsource.org/2012/05/06/spring-mvc-3-2-preview-introducing-servlet-3-async-support/ https://blogs.oracle.com/ enterprisetechtips/entry/asynchronous_support_in_servlet_3 Tôi sẽ đăng lại nếu tôi đưa ra ví dụ làm việc. – CAL5101