2012-11-20 4 views
8

클라이언트에서 대용량 파일을 업로드 할 수 있습니다. 청크를 사용하여 요청 크기를 줄이기 위해 우리는 Plupload을 사용하기 때문에 파일을 청크로 보내는 것이 쉽습니다. 그러나, 나는 그 덩어리를 다루는 방법을 잘 모른다. 우리는 서버에서 Spring MVC를 사용하고 있으며 컨트롤러 메서드에 대해 다음을 가지고 있습니다. uploadMedia(@RequestBody MultipartFile file)MultipartFileorg.springframework.web.multipart.MultipartFile입니다. 청킹을하지 않을 때 이것은 잘 작동합니다. 청크를 클라이언트 측에서 켜면, 여전히이 메소드로 들어갈 수 있지만, 전달 된 파일에는 아무것도 표시되지 않습니다.이 파일은 청크가 어떤 파일인지 식별합니다. 바라기를 나는 방금 뭔가를 놓친다.서버에서 파일 업로드 청크를 처리하는 방법 (Plupload/Spring MVC)?

이것은 일반적인 워크 플로우 인 것처럼 보이지만 서버 측에서 어떻게 수행되는지에 대한 좋은 예를 찾을 수없는 것 같습니다. 방금 Spring을 사용한 솔루션은 훌륭 하겠지만 다른 라이브러리가 필요하다면 괜찮습니다. 나는 Apache Commons FileUpload에 약간 보았다, 그러나 거기에 chunking에 관하여 아무것도를 찾아 낼 수 없었다. 이것에 대한 도움이 될 것입니다. 감사.

답변

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