Domanda

sto usando play framework per costruire un sito web. E Io uso anche un ricco editor chiamato xheditor .

Xheditor supporto AJAX-fileuploading, ha bisogno il lato server ha un'azione che accetta il parametro "filedata", che contiene il file di caricamento.

Così ho scritto un'azione di caricamento:

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

Funziona bene in IE6, il FILEDATA non è nullo e contiene i dati corretti. Ma, se io uso Chrome o Firefox, il FILEDATA è nullo !!

Io uso Firebug per monitorare ciò che il Firebug presentare, e lo abbiamo trovato presento come intestazione di una:

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

Credo che il gioco non è gestire questo caso in modo corretto, in modo che il parametro "FILEDATA" è nullo.

Al fine di lavoro con Chrome e Firefox, ho modificato che l'azione:

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

Questa è lavorato in IE6, Chrome e Firefox ora, MA , solo se il file di caricamento è molto piccolo. Per esempio. meno di 4K. Se si tratta di un po 'più grande, per esempio 12K, il metodo del "IOUtils.copy" riporterà "Errore di lettura!", Anche il seguente codice segnalerà tale errore:

request.body.available()
request.body.read()
request.body.read(bytes)
È stato utile?

Soluzione

Si dovrebbe dare un'occhiata alla classe play.data.parsing.ApacheMultipartParser che gestisce l'estrazione file allegato da richiesta HTTP.

Il RicavaNomeCampo prende il nome del campo di intestazione di ricerca "Content-Disposition" e "form-data". Nel tuo caso, non è 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;
}

nel getFilename, cerca l'intestazione "Content-Disposition" e poi "form-data" o "attaccamento" per ottenere il nome del file.

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

Quindi, a quanto pare, nel tuo caso, questo codice sarà trovare il nome del file, ma non il nome del campo in modo forse questo è il motivo per cui avete il vostro set di campo filedata a null nel controller.

Perché funziona con IE6? (Perché non è mai stato veramente serie e fa qualcosa che gli altri non lo fanno più ??? :))

Per informazioni, nel modulo Crud, il fileField.html dichiara caricamento di file come segue:

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

Per quanto riguarda

Altri suggerimenti

Prova integrare il tuo sito con uploader di file, che hanno un lof di documentazione / campioni per lingue diffrent www.uploadify.com /

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top