Pregunta

Estoy usando playframework para construir un sitio web. Y también uso un editor rico llamado xheditor .

Xheditor apoyo ajax-fileuploading, necesita el lado del servidor tiene una acción que acepta 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 utilizo Chrome o Firefox, la filedata es nula !!

Yo uso Firebug para monitorear lo que presente el incendiario, y lo encontró presento cabecera tal:

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, que modifica la 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, y , sólo si el archivo de carga es muy pequeña. P.ej. menos de 4K. Si es un poco más grande, por ejemplo, 12K, el método "IOUtils.copy" informará "Error de lectura!", Incluso el siguiente código informará dicho error:

request.body.available()
request.body.read()
request.body.read(bytes)
¿Fue útil?

Solución

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

El getFieldName obtiene el nombre de la cabecera de la búsqueda campo "Content-Disposition" y "form-data". En su caso, no es 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, se busca en 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 juego filedata a 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}" />

lo que respecta

Otros consejos

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top