7

Estoy usando playframework para crear un sitio web. Y también uso un editor rico llamado xheditor.Carga de archivos en playframework con diferentes navegadores

Xheditor admite ajax-fileuploading, necesita que el servidor tenga una acción que acepte el parámetro "filedata" que contiene el archivo de carga.

Así que escribió una acción de carga:

public class Application extends Controller { 
    public static void upload(File filedata) { 
     // the filedata should not be null 
     renderText("{'err':'', 'msg':{'ur':'/uploaded/xxx.zip'}}"); 
    } 
} 

Funciona bien en IE6, el filedata no es nulo y contiene los datos correctos. Pero, si uso Chrome o Firefox, los archivos son null !!

utilizo Firebug para monitorear lo que presente el incendiario, y lo encontraron presentar una cabecera como:

content-disposition 
attachment; name="filedata"; filename="051111twdns.zip" 

Creo que el juego no ha manejar este caso correctamente, por lo que el parámetro "filedata" es nulo.

Con el fin de trabajar con Chrome y Firefox, modifiqué esa acción:

public class Application extends Controller { 
    public static void upload(File filedata) { 
     if(filedata!=null) { 
      // ok, it's IE6 
      renderText("{'err':'', 'msg':{'ur':'/uploaded/xxx.zip'}}"); 
     } else { 
      // it's chrome or firefox, the data is in request.body 
      File targetFile = new File("upload/test.zip"); 
      IOUtils.copy(request.body, new FileOutputStream(targetFile)); 
     } 
    } 
} 

Esto se trabajó en IE6, Chrome y Firefox ahora, PERO, sólo si el archivo de carga es muy pequeña. P.ej. menos de 4K. Si es un poco más grande, p. 12K, el método "IOUtils.copy" informará "Read Error!", Incluso el siguiente código informará dicho error:

request.body.available() 
request.body.read() 
request.body.read(bytes) 

Respuesta

0

Debería echar un vistazo a la clase play.data.parsing.ApacheMultipartParser que gestiona la extracción de archivos adjuntos de la solicitud HTTP.

getFieldName obtiene el nombre del encabezado de búsqueda de campo "content-disposition" y "form-data". En tu caso, no está presente.

private String getFieldName(Map /* String, String */ headers) { 
    String fieldName = null; 
    String cd = getHeader(headers, CONTENT_DISPOSITION); 
    if (cd != null && cd.toLowerCase().startsWith(FORM_DATA)) { 

     ParameterParser parser = new ParameterParser(); 
     parser.setLowerCaseNames(true); 
     // Parameter parser can handle null input 
     Map params = parser.parse(cd, ';'); 
     fieldName = (String) params.get("name"); 
     if (fieldName != null) { 
      fieldName = fieldName.trim(); 
     } 
    } 
    return fieldName; 
} 

en el getFileName, busca el encabezado "Content-Disposition" y luego "form-data" o "unión" para obtener el nombre del archivo.

private String getFileName(Map /* String, String */ headers) { 
    String fileName = null; 
    String cd = getHeader(headers, CONTENT_DISPOSITION); 
    if (cd != null) { 
     String cdl = cd.toLowerCase(); 
     if (cdl.startsWith(FORM_DATA) || cdl.startsWith(ATTACHMENT)) { 
      ParameterParser parser = new ParameterParser(); 
      parser.setLowerCaseNames(true); 
      // Parameter parser can handle null input 
      Map params = parser.parse(cd, ';'); 
      if (params.containsKey("filename")) { 
       fileName = (String) params.get("filename"); 
       if (fileName != null) { 
        fileName = fileName.trim(); 
        // IE7 returning fullpath name (#300920) 
        if (fileName.indexOf('\\') != -1) { 
         fileName = fileName.substring(fileName.lastIndexOf('\\') + 1); 
        } 

       } else { 
        // Even if there is no value, the parameter is present, 
        // so we return an empty file name rather than no file 
        // name. 
        fileName = ""; 
       } 
      } 
     } 
    } 
    return fileName; 
} 

Así que al parecer, en su caso, este código se encuentra el nombre pero no el nombre del campo así que tal vez es por eso que usted tiene su campo de filedata establece en nulo en su controlador.

¿Por qué funciona con IE6? (Porque nunca ha sido realmente estándar y hace algo que los otros no hacen más ??? :))

Para obtener información, en el módulo de un mantenimiento, el fileField.html declara la carga de archivos de la siguiente manera:

<input id="${field.id}" class="${field.errorClass}" type="file" name="${field.name}" /> 

respetos

1

Trate de integrar su sitio con cargador de archivos, que tienen un lof de la documentación/muestras para diferentes idiomas www.uploadify.com/

Cuestiones relacionadas