Frage

Ich verwende playframework eine Website zu bauen. Und ich benutze auch eine reiche Editor namens xheditor .

Xheditor Unterstützung Ajax-fileuploading, es muss die Server-Seite eine Aktion hat die "FILEDATA" Parameter akzeptiert, die die Upload-Datei enthalten.

So schrieb ich eine Upload-Aktion:

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

Es funktioniert in IE6, die FILEDATA nicht null ist und enthält die richtigen Daten. Aber, wenn ich Chrome oder Firefox, die FILEDATA ist null !!

Ich benutze Firebug zu überwachen, was die Firebug einreichen, und fand es einreichen eine solche Header:

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

Ich denke Spiel hat diesen Fall nicht richtig handhaben, so dass der Parameter „FILEDATA“ null ist.

Um die Arbeit mit Chrome und Firefox, ich geändert, dass die Aktion:

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

Dies wird gearbeitet in IE6, Chrome und Firefox jetzt, ABER , nur, wenn die Upload-Datei sehr klein ist. Z.B. weniger als 4K. Wenn es ein wenig größer, z.B. 12K, die Methode "IOUtils.copy" werden "Read Error" melden, auch der folgende Code wird ein solcher Fehler melden:

request.body.available()
request.body.read()
request.body.read(bytes)
War es hilfreich?

Lösung

Sie sollten einen Blick auf play.data.parsing.ApacheMultipartParser Klasse nehmen, die den Dateianhang Extraktion von HTTP-Anforderung verwaltet.

Die GetFieldName erhält den Namen des Feldes Such Header "Content-Disposition" und "form-data". In Ihrem Fall ist es nicht vorhanden ist.

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

in den getFileName, sucht er die Header "Content-Disposition" und dann "form-data" oder "Anhang", um die Dateinamen zu bekommen.

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

So offenbar, in Ihrem Fall, wird dieser Code die Dateinamen finden, aber nicht die Feldnamen so vielleicht ist das, warum Sie Ihr Feld FILEDATA auf Null gesetzt in Ihrem Controller haben.

Warum funktioniert es mit IE6? (Weil es war nie wirklich Standard und tut etwas, was die anderen nicht mehr tun ??? :))

Weitere Informationen in dem Crud-Modul, das fileField.html erklärt Datei-Upload, wie folgend:

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

Bezug

Andere Tipps

Versuchen Sie Ihre Website mit Datei-Uploader integrieren, die eine lof der Dokumentation haben / samples für unterschiedliche Sprachen www.uploadify.com /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top