2011-10-03 29 views
5

Tengo algunos problemas para cargar archivos múltiples. Cuando selecciono x archivos, se procesa correctamente, pero el primer archivo se carga x veces y los demás no se cargan. ¿Alguien capaz de señalar lo que estoy haciendo mal?Carga de archivos múltiples en 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} 

Manejo de los archivos:

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

Respuesta

3

llegó a trabajar así que si alguien está siempre interesada:

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 
} 

sería feliz para obtener una solución de trabajo con una serie de objetos Blob en lugar de tener que request.args.get ("__ archivos") si es posible.

+0

¿Viste esto: P - http://stackoverflow.com/questions/7401364/multi-file-upload-with-play/7571000#7571000? – Rifat

+0

¿Podría aceptar su respuesta, por favor? Gracias. –

-1

En caso de no ser <input type="file" multiple name="files" id="files"/>: <input type="file multiple" name="files" id="files"/>?

En segundo lugar, ¿dónde guarda realmente su imagen? Creo que debería guardarlo en su bucle, donde pone project.addPicture(picture);, pero en realidad parece que las imágenes se guardan en el sistema en su última línea: addPicture(id); Esto explica por qué guarda la misma imagen (la última o la primera (no seguro cómo se analizan)) varias veces.

+0

Gracias por la respuesta, pero no se procesó como carga múltiple de archivos. project.addPicture (imagen) guarda la imagen y addPicture (id) solo muestra la vista para cargar la imagen. ¿Alguna otra idea? – vegardoj

+0

Definitivamente no. ['multiple' es un atributo separado] (http://www.w3.org/TR/html-markup/input.file.html#input.file.attrs.multiple) y no parte del valor de' type' . –

2

Así que usted puede utilizar para unir @As el procesamiento de un parámetro a un juego específico TypeBinder

Así que con esto:

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

Y esto html

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

Por lo tanto, tiene que hacer un molde con algo como File [] doo = (File []) xxx;

+1

Puede crear su propia carpeta para que el controlador se vuelva más limpio –

Cuestiones relacionadas