2012-11-20 33 views
8

Trên máy khách của chúng tôi, có thể tải lên các tệp lớn. Chúng tôi muốn sử dụng chunking để giảm kích thước của các yêu cầu. Chúng tôi đang sử dụng Plupload, vì vậy thật dễ dàng để gửi các tệp theo khối. Tuy nhiên, tôi không chắc chắn làm thế nào để xử lý các khối. Chúng tôi đang sử dụng Spring MVC trên máy chủ và tôi hiện có các điều sau cho phương thức điều khiển của mình: uploadMedia(@RequestBody MultipartFile file) trong đó MultipartFileorg.springframework.web.multipart.MultipartFile. Điều này hoạt động tốt khi không làm chunking. Khi tôi bật chunking trên phía khách hàng, nó vẫn được vào phương pháp này tốt, nhưng tôi không thấy bất cứ điều gì trên tập tin mà được thông qua trong đó xác định những gì tập tin các đoạn là một phần của. Hy vọng rằng tôi chỉ thiếu một cái gì đó.Cách xử lý khối tải tệp lên máy chủ (Plupload/Spring MVC)?

Có vẻ như đây là một quy trình công việc phổ biến, nhưng tôi dường như không thể tìm thấy bất kỳ ví dụ hay nào về cách thực hiện điều này ở phía máy chủ. Một giải pháp chỉ với Spring sẽ là tuyệt vời, nhưng nếu cần thư viện khác, điều đó cũng tốt. Tôi nhìn một số ở Apache Commons FileUpload, nhưng tôi không thể tìm thấy bất cứ điều gì về chunking trên đó. Bất kỳ trợ giúp với điều này sẽ là tuyệt vời. Cảm ơn.

Trả lời

8

Tôi đã sửa lỗi thông qua việc này một số chi tiết và thêm HttpServletRequest vào phương pháp điều khiển của tôi để xem có bất kỳ thứ gì có sẵn trong đó hay không. Tôi nhận thấy rằng yêu cầu tôi nhận được là org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest có một trường có tên là multipartParameters chỉ là HashMap. Tôi thấy rằng bản đồ này có các khóa của name, chunkschunk. Vì vậy, tôi quyết định thử cách sau như chữ ký của tôi:

uploadMedia(@RequestBody MultipartFile file, @RequestParam String name, @RequestParam int chunks, @RequestParam int chunk) 

đủ Chắc chắn, những thông số @RequestParam bị dân cư với tên của tập tin, số lượng các khối, và số đoạn (zero-based) tương ứng. Có thông tin này với mỗi yêu cầu sẽ làm cho nó khá dễ dàng để lắp ráp các đoạn vào tập tin cuối cùng.

Một điều cần biết, là nếu tập tin không cần phải được chunked (kích thước tập tin nhỏ hơn kích thước chunk), các thông số chunkschunk không được gửi lên. Vì vậy, chữ ký cuối cùng của tôi đã kết thúc như sau:

uploadMedia(@RequestBody MultipartFile file, @RequestParam String name, @RequestParam(required=false, defaultValue="-1") int chunks, @RequestParam(required=false, defaultValue="-1") int chunk) 

Sau đó, tôi có thể kiểm tra -1 để xem liệu tôi có cần phải lo lắng về việc chunking hay không.

Vì vậy, trong phương pháp điều khiển bản thân tôi có một cái gì đó như thế này:

Media media = new Media(); 
//set stuff on my Media object for storing info about the file in the DB 
//.... 
if (chunks > 0 && chunk > 0) 
{ 
    //Need to append the bytes in this chunk 
    mediaRepository.appendBytes(media, file.getBytes()); 
    if (chunk == chunks - 1) 
    { 
     //last chunk, upload is done 
     onUploadFinished(media); 
    } 
} 
else 
{ 
    //Write out the first set of bytes 
    mediaRepository.saveBytes(media, file.getBytes()); 
    if (chunks <= 0) 
    { 
     //no chunks were needed, all the bytes have been written out, upload is done 
     onUploadFinished(media); 
    } 
} 
+0

là nó có thể xem chi tiết của bộ điều khiển? Tôi đang cố gắng để thực hiện các chức năng tương tự và đang đấu tranh với phần còn lại của bộ điều khiển. – zmanc

+0

Tôi đã cập nhật câu trả lời để bao gồm nhiều mã điều khiển hơn. – dnc253

+0

nếu bạn không nhớ, bạn có thể chia sẻ một phần lưu trữ mediaRepository của bạn không? – zmanc

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