2012-11-20 14 views
8

Na naszym kliencie możliwe jest przesyłanie dużych plików. Chcemy używać chunking, aby zmniejszyć rozmiar żądań. Używamy Plupload, więc łatwo jest wysłać pliki w porcjach. Jednak nie jestem pewien, jak sobie z tym poradzić. Używamy Spring MVC na serwerze, a ja mam następujące aktualne dla mojej metody kontrolera: uploadMedia(@RequestBody MultipartFile file) gdzie MultipartFile jest org.springframework.web.multipart.MultipartFile. Działa to dobrze, gdy nie robi się chunking. Kiedy włączam chunking po stronie klienta, nadal dostaje się do tej metody dobrze, ale nie widzę niczego w pliku, który zostanie przekazany, który identyfikuje, do którego pliku jest częścią. Mam nadzieję, że po prostu coś mi brakuje.Jak radzić sobie z porcjami przesyłania plików na serwerze (Plupload/Spring MVC)?

Wygląda na to, że jest to typowy przepływ pracy, ale nie mogę znaleźć żadnych dobrych przykładów, jak to zrobić po stronie serwera. Rozwiązanie z samą wiosną byłoby świetne, ale jeśli potrzebna jest inna biblioteka, to też jest w porządku. Spojrzałem trochę na Apache Commons FileUpload, ale nie mogłem znaleźć nic na temat chunking tam. Każda pomoc z tym będzie świetna. Dzięki.

Odpowiedz

8

I debugowałem przez to więcej i dodałem HttpServletRequest do mojej metody kontrolera, aby sprawdzić, czy tam było coś dostępnego. Zauważyłem, że otrzymałem prośbę o wydanie org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest, która ma pole o nazwie multipartParameters, które jest po prostu HashMap. Odkryłem, że ta mapa ma klucze: name, chunks i chunk. Więc postanowiłem spróbować następujących jak mój podpis:

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

Rzeczywiście, te @RequestParam parametry ale zaludnionych z nazwą pliku, liczbę kawałków, a liczba bryłkach (zero-based), odpowiednio. Posiadanie tych informacji przy każdym żądaniu sprawi, że łatwo będzie złożyć porcje do ostatecznego pliku.

Jedną rzeczą jest również to, że jeśli plik nie musi być porcjowany (rozmiar pliku jest mniejszy niż rozmiar porcji), parametry chunks i chunk nie są wysyłane. Tak, mój ostateczny podpis skończyło się patrząc tak:

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

Wtedy mogę sprawdzić -1 aby sprawdzić, czy muszę się martwić o wyrwy w ogóle.

Tak, w samej metodzie kontrolera mam coś takiego:

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

to możliwe, aby zobaczyć więcej kontrolera? Próbuję wdrożyć tę samą funkcjonalność i zmagam się z resztą kontrolera. – zmanc

+0

Zaktualizowałem odpowiedź, aby dodać więcej kodu kontrolera. – dnc253

+0

jeśli nie masz nic przeciwko, możesz podzielić się częścią swojego mediaRepository? – zmanc