2012-11-20 55 views
8

在我們的客戶端上,可能會上傳大文件。我們希望使用分塊來減少請求的大小。我們使用的是Plupload,所以很容易發送文件塊。但是,我不確定如何處理這些塊。我們在服務器上使用Spring MVC,而我目前對我的控制器方法有以下幾點:uploadMedia(@RequestBody MultipartFile file)其中MultipartFileorg.springframework.web.multipart.MultipartFile。這在沒有分塊的情況下工作得很好。當我打開客戶端的分塊時,它仍然會進入這個方法,但是我沒有看到傳入的文件中的任何內容,這表示該塊是哪個文件的一部分。希望我只是想念一些東西。如何處理服務器上的文件上傳塊(Plupload/Spring MVC)?

看起來這是一個常見的工作流程,但我似乎無法找到任何有關在服務器端如何完成的好例子。只有Spring的解決方案會很好,但如果需要另一個庫,那也沒問題。我看了一下Apache Commons FileUpload,但我在那裏找不到任何關於分塊的東西。任何幫助,這將是偉大的。謝謝。

回答

8

我通過這個更多的調試,並添加一個HttpServletRequest我的控制器方法,看看有沒有什麼可用的。我發現我收到的請求是一個org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest,它有一個名爲multipartParameters的字段,它只是一個HashMap。我發現這張地圖有name,chunkschunk的密鑰。所以,我決定嘗試以下爲我的簽名:

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

果然,那些@RequestParam參數得到了與文件,數據塊的數量和塊數名填充(從零開始)分別。將這些信息與每個請求進行比較可以使組合塊成爲最終文件非常容易。

還有一件事要知道的是,如果文件不需要分塊(文件大小小於塊大小),chunkschunk參數不會發送。所以,我最後的簽名結束這樣看:

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

然後我可以檢查-1,看看我是否需要擔心的分塊的。

因此,在控制器方法本身我有這樣的事情:

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

是有可能看到更多的控制器呢?我試圖實現相同的功能,並正在努力控制器的其餘部分。 – zmanc

+0

我已經更新了包含更多控制器代碼的答案。 – dnc253

+0

如果你不介意你可以分享一部分你的mediaRepository? – zmanc

相關問題