Question

J'utilise pour construire un play framework site web. Et j'utilise aussi un éditeur riche nommé xheditor .

Support Xheditor ajax-fileuploading, il a besoin du côté du serveur a une action qui accepte le paramètre "filedata" qui contient le fichier de téléchargement.

J'ai donc écrit une action de téléchargement:

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

Il fonctionne très bien dans IE6, le filedata est non nul et contient les données correctes. Mais, si j'utilise Chrome ou Firefox, le filedata est null !!

J'utilise Firebug pour surveiller ce que le soumettre Firebug, et l'ai trouvée soumettre en-tête un:

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

Je pense que le jeu a pas manipuler correctement ce cas, si le paramètre « filedata » est nulle.

Pour travailler avec Chrome et Firefox, j'ai modifié cette action:

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

Ceci est travaillé dans IE6, Chrome et Firefox maintenant, et , que si le fichier de téléchargement est très faible. Par exemple. moins de 4 ko. Si elle est un peu plus grand, par exemple 12K, la méthode "IOUtils.copy" rendra compte, même le code suivant "Read Error!" Signale une telle erreur:

request.body.available()
request.body.read()
request.body.read(bytes)
Était-ce utile?

La solution

Vous devriez jeter un oeil à la classe play.data.parsing.ApacheMultipartParser qui gère l'extraction des pièces jointes de requête HTTP.

Le ObtenirNomRubrique obtient le nom de l'en-tête de la recherche sur le terrain « content-disposition » et « form-data ». Dans votre cas, ce n'est pas présente.

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

dans le getFileName, il recherche l'en-tête "content-disposition" et "form-data" ou "attachement" pour obtenir le nom du fichier.

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

Donc, apparemment, dans votre cas, ce code se trouve le nom de fichier, mais pas le nom du champ alors peut-être c'est la raison pour laquelle vous avez votre jeu de champs filedata null dans votre contrôleur.

Pourquoi faut-il travailler avec IE6? (Parce qu'il n'a jamais été vraiment standard et fait quelque chose que les autres ne le font pas plus ??? :))

Pour plus d'informations, dans le module Crud, le fileField.html déclare le téléchargement de fichiers comme suit:

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

ce qui a trait

Autres conseils

Essayez d'intégrer votre site avec le fichier Uploader, qui ont un lof de documents / échantillons pour les langues diffrent www.uploadify.com /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top