2011-10-03 7 views
5

Mam problemy z pobieraniem wielu plików do działania. Kiedy wybieram pliki x, przechodzi pomyślnie, ale pierwszy plik jest ładowany x razy, a pozostałe nie są w ogóle przesyłane. Czy ktoś może wskazać, co robię źle?Przesyłanie wielu plików w Playframework

Postać:

#{form @Projects.uploadPictures(project.id), enctype:'multipart/form-data'} 

<p> 
    <label>&{'title'}</label> 
    <input type="text" name="title"/> 
    <strong>(&{'addPicture.chooseTitle'})</strong> 
</p> 
<p> 
    <label>&{'Pictures'}</label> 
    <input type="file" multiple name="files" id="files"/> 
</p> 
<p> 
    <input type="submit" value="&{'publish'}" /> 
</p> 

#{/form} 

Obsługa plików:

public static void uploadPictures(long id, String title, List<Blob> files) { 
    String error = "";   
    if(files != null && !title.trim().equals("")) { 
     Project project = Project.findById(id); 
     // Save uploaded files 
     Picture picture; 

     for(int i = 0; i<files.size(); i++) { 
      if(files.get(i) != null) { 
       System.out.println("i: "+i+"\nFiltype: "+files.get(i).type()); 
       if(files.get(i).type().equals("image/jpeg") || files.get(i).type().equals("image/png")) { 
        picture = new Picture(project, title+"_bilde_"+(i+1), files.get(i)); 
        project.addPicture(picture); 
       } else { 
        error += "Fil nummer "+(i+1)+" er av typen "+files.get(i).type()+" og ikke av typen .JPG eller .PNG og ble dermed ikke lagt til. \n"; 
       } 
      } else { 
       error = "Ingen filer funnet"; 
      } 
     } 
    } else { 
     error = "Velg en tittel for bildene"; 
    } 
    if(error.equals("")) { 
     flash.success("Picture(s) added"); 
    } else { 
     flash.error(error); 
    } 
    addPicture(id); 
} 

Odpowiedz

3

Got go do pracy tak, jeśli ktoś jest zainteresowany kiedykolwiek:

public static void uploadPictures(long id, String title, File fake) { 
    List<Upload> files = (List<Upload>) request.args.get("__UPLOADS"); 
    if(files != null) { 
     Project project = Project.findById(id); 
     Picture picture; 
     Blob image; 
     InputStream inStream; 
     for(Upload file: files) { 
      if(file != null) { 
       try { 
        inStream = new java.io.FileInputStream(file.asFile()); 
        image = new Blob(); 
        image.set(inStream, new MimetypesFileTypeMap().getContentType(file.asFile())); 
        picture = new Picture(project, file.getFileName(), image); 
        project.addPicture(picture); // stores the picture 
       } catch (FileNotFoundException e) { 
        System.out.println(e.toString()); 
       } 
      } 
     } 
    } 
    addPicture(id); //renders the image upload view 
} 

Chętnie otrzymać roztwór roboczy z tablicą obiektów Blob zamiast request.args.get („__ aktualizacje”) Jeśli to możliwe.

+0

Czy widzisz to: P - http://stackoverflow.com/questions/7401364/multi-file-upload-with-play/7571000#7571000? – Rifat

+0

Czy możesz przyjąć swoją odpowiedź, proszę? dzięki. –

-1

Gdyby <input type="file" multiple name="files" id="files"/> nie być: <input type="file multiple" name="files" id="files"/>?

Po drugie, gdzie właściwie zapisać obraz? Myślę, że powinieneś zapisać go w swojej pętli, gdzie wstawiasz project.addPicture(picture);, ale tak naprawdę wygląda na to, że obrazy są zapisywane w systemie w ostatniej linii: addPicture(id); Ten rodzaj wyjaśnia, dlaczego zapisuje ten sam obraz (ostatni lub pierwszy (nie na pewno są one przetwarzane)) wiele razy.

+0

Dzięki za odpowiedź, ale nie wyświetlało się jako wielokrotne wysyłanie plików. project.addPicture (obrazek) zapisuje obraz, a addPicture (id) renderuje widok do przesłania obrazu. Jakieś inne pomysły? – vegardoj

+0

Zdecydowanie nie. ['multiple' jest oddzielnym atrybutem] (http://www.w3.org/TR/html-markup/input.file.html#input.file.attrs.multiple) i nie jest częścią wartości dla' type' . –

2

Więc można użyć @As powiązać przetwarzania param do konkretnego zagraj TypeBinder

Więc z tego:

public static void chargedMultiUpload(@As(binder = FileArrayBinder.class) Object xxx) throws IOException{ ... } 

i to html

<input type="file" multiple name="files" id="files"/> 

Więc musisz wykonać rzut z czymś w rodzaju File [] doo = (File []) xxx;

+1

Możesz utworzyć własny segregator, aby kontroler stał się czystszy –