IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

HTML Discussion :

Enctype sur un POST de fichier et de texte JEE


Sujet :

HTML

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 22
    Points
    22
    Par défaut Enctype sur un POST de fichier et de texte JEE
    Bonjour,

    Je travaille sur une interface de post de fichier de logs avec parseur en JEE. Sur mon index.html, l'utilisateur peut poster un fichier et modifier, s'il le souhaite, la date du fichier (relative à son nom).

    J'ai donc un fichier html qui ressemble à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <html>
      <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <title>Upload file</title>
      </head>
     
    <body>
    <form action="webapplication" method="post" enctype="multipart/form-data">  
     Select file to upload: <input type="file" name="selectFile" />   </br>
     If you need to change the date of the file, put it here, else, let it empty (Format:'YYYYMMDD-hhmmss'): <input type="text" id="dates" name="dates" maxlength="15" />
    <input type="submit">   
    </form>  
    </body>
    </html>
    La récuperation des données du fichier s'effectue correctement dans ce cas. Cependant lorsque je tente de récupérer mon input text de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(req.getParameter("dates"));
    Ma console affiche null.

    J'ai donc planché et me suis rendue compte que lorsque je modifie ma balise form de cette manière (au niveau de l'enctype):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <form action="webapplication" method="post" enctype="multipart/text-plain">
    Je récupère bien mon input text mais plus mon fichier.

    Je cherche sur Internet mais je ne trouve rien qui explique quel type d'enctype utiliser dans cette situation (qui me semble, par ailleurs, assez fréquente tout de même).

    Du coup, si quelqu'un a une idée, j'aimerais beaucoup la connaitre et ça me plairait bien aussi de comprendre pourquoi ce paramètre me casse les pieds en java tandis que lorsque je fais du php ça n'a jamais été le cas.

    En vous remerciant.

    Edit: Il semblerait que lorsque l'upload de fichier fonctionne (à savoir que je travaille sous GAE, je n'enregistre donc pas le fichier mais je le parse directement pour renseigner ma base de données) mon champ texte s'ajoute à la fin de mon contenu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(lineContent);
    Qui me retourne en dernière ligne le contenu de ma textbox...

    Ne puis-je pas récupérer ces données séparément???

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Humm. En J2EE réceptionner un fichier envoyé dans une requête HTTP, ça peut se faire de plusieurs façons différentes, mais il faut en avoir choisi une.
    Il faudrait déjà que tu nous dises laquelle tu as prise.

    Avec GAE c'est encore moins évident. J'ai pu une fois utiliser cette technique décrite sur leur site, et où les fichiers et les autres paramètres sont tous lus en streaming en passant par FileItemStream.


    Je suis surpris que enctype="multipart/plain-text" ait eu un effet quelconque. Ça n'existe pas. Chez moi Firefox fait comme si je n'avais rien dit, et envoie le formulaire avec multipart/form-data par défaut, puisque c'est la seule manière d'envoyer un fichier qui est pas tout seul.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Ah très bien, merci de ta réponse en tout cas
    En réalité, j'avais trouvé enctype="multipart/plain-text" sur un site et comme j'ai testé tout ce que je trouvais par dépit ^^" d'ailleurs, si je supprime totalement la balise enctype je récupère bien l'input donc ça semble logique finalement que ça puisse fonctionner avec une erreur de balise. (Je suis sur Chrome pour le moment)

    Je récupère ma request de la manière suivante:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ServletFileUpload upload = new ServletFileUpload();
     
    FileItemIterator iterator = upload.getItemIterator(req);
    while (iterator.hasNext()) {
    	FileItemStream item = iterator.next();
    	InputStream resourceContent = item.openStream();
    	String files=item.getName();
    	InputStreamReader ipsr = new InputStreamReader(resourceContent);
    	BufferedReader br = new BufferedReader(ipsr);

    Et après quelques tests pour voir mon dernier mot du "br", je viens de m'apercevoir que les champs sont bien séparés. Je m'explique:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String lastLine="";
    String line;
    while ((line = br.readLine()) != null) {
    	if (!line.isEmpty()) {
    		lastLine=line.substring(line.lastIndexOf(" ")+1);;
    	}
    }
    System.out.println(lastLine);

    Ce bout de code me renvoie :
    100000000001319
    test


    "100000000001319" étant le dernier mot de mon fichier et "test" étant l'input.

    Est-il possible de les dissocier?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Eh bien, dans ton while (iterator.hasNext()) { tu pourrais appeler item.getFieldName() et faire un traitement différent si c'est ton input ou ton fichier.

    En principe il suffirait de mettre l'input texte avant l'input file dans le HTML (au pire en bricolant avec un peu de JavaScript si tu veux qu'ils s'affichent ficher avant et texte après.) Mais je ne sais pas si on peut vraiment compter dessus.
    Auquel cas, tu te retrouverais forcée à charger le fichier de log entièrement en mémoire avant de le traiter, ou l'enregistrer dans le storage de GAE, puis lire l'input, puis récupérer le storage.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    J'étais partie là dessus en effet, je vais modifier l'emplacement des champs pour récupérer mon text en premier (je n'y avais pas pensé, j'essayais de récupérer la dernière valeur en premier).
    Merci beaucoup!

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 22
    Points
    22
    Par défaut
    Si jamais quelqu'un cherche:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    ServletFileUpload upload = new ServletFileUpload();
     
    FileItemIterator iterator = upload.getItemIterator(req);
    while (iterator.hasNext()) {
    	FileItemStream item = iterator.next();
    	String name = item.getFieldName();
    	InputStream resourceContent = item.openStream();
     
    	String files=item.getName();
    	InputStreamReader ipsr = new InputStreamReader(resourceContent);
    	BufferedReader br = new BufferedReader(ipsr);
     
    	if(name.equals("dates")){
    		files=br.readLine();
    	}
    	else if(name.equals("selectFile")){
    		while ((lineContent = br.readLine()) != null) {
                        //code
    		}
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Chercher un fichier spécifique sur le poste client
    Par Orb Dorb dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 14/10/2005, 18h45
  2. Réponses: 6
    Dernier message: 06/10/2005, 20h54
  3. [Servlet] Créer un fichier sur un poste distant
    Par JohnBlatt dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 07/05/2005, 18h51
  4. Réponses: 2
    Dernier message: 14/05/2004, 12h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo