2011-10-03 15 views
5

Sto riscontrando qualche problema nel far funzionare più caricamenti di file. Quando seleziono x file, viene eseguito correttamente, ma il primo file viene caricato x volte e gli altri non vengono caricati affatto. Qualcuno in grado di indicare cosa sto facendo male?Caricamento file multiplo in playframework

Forma:

#{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} 

Gestione dei file:

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); 
} 

risposta

3

preso a lavorare in questo modo se qualcuno è mai interessata:

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 
} 

sarebbe felice di ottenere una soluzione di lavoro con una serie di oggetti Blob, invece di dover request.args.get ("__ UPLOADS") se possibile.

+0

Hai visto questo: P - http://stackoverflow.com/questions/7401364/multi-file-upload-with-play/7571000#7571000? – Rifat

+0

Potresti accettare la tua risposta per favore? Grazie. –

-1

caso <input type="file" multiple name="files" id="files"/> non essere: <input type="file multiple" name="files" id="files"/>?

In secondo luogo, dove salvi effettivamente l'immagine? Penso che dovresti salvarlo nel tuo loop, dove inserisci project.addPicture(picture);, ma in realtà sembra che le immagini siano state salvate nel sistema nell'ultima riga: addPicture(id); Questo tipo spiega perché salva la stessa immagine (ultima o prima (non sicuro come vengono analizzati)) più volte.

+0

Grazie per la risposta, ma non viene visualizzato come caricamento di file multipli. project.addPicture (immagine) salva l'immagine e addPicture (id) mostra solo la vista per il caricamento dell'immagine. Altre idee? – vegardoj

+0

Decisamente no. ['multiple' è un attributo separato] (http://www.w3.org/TR/html-markup/input.file.html#input.file.attrs.multiple) e non parte del valore di' type' . –

2

Così si può utilizzare @As di impegnare l'elaborazione di un parametro a una specifica Giocare TypeBinder

Quindi, con questo:

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

E questo html

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

Così, devi fare un cast con qualcosa come File [] doo = (File []) xxx;

+1

È possibile creare il proprio raccoglitore in modo che il controllore diventi più pulito –