7

J'utilise playframework pour créer un site Web. Et j'utilise également un éditeur riche nommé xheditor.Télécharger un fichier dans playframework avec différents navigateurs

Xheditor support ajax-fileuploading, il faut que le côté serveur ait 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 fichier est null !!

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

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

Je pense que le jeu n'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, MAIS, que si le fichier de téléchargement est très faible. Par exemple. moins de 4K. Si c'est un peu plus grand, par ex. 12K, la méthode « IOUtils.copy » rapportera « Read Error! », Même le code suivant signaler cette erreur:

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

Répondre

0

Vous devriez jeter un oeil à la classe play.data.parsing.ApacheMultipartParser qui gère l'extraction des pièces jointes à partir de la requête HTTP. Le nom getFieldName obtient le nom de l'en-tête de recherche de champ "content-disposition" et "form-data". Dans votre cas, ce n'est pas présent.

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 trouvera le nom du fichier, mais pas le nom du champ alors peut-être c'est la raison pour laquelle vous avez votre champ filedata réglé sur null dans votre contrôleur.

Pourquoi cela fonctionne-t-il 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}" /> 

salutations

1

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