upload

upload - Java - Programmation

Marsh Posté le 24-08-2004 à 12:17:32    

Salut,
je fais une appli web en utilisant des servlets.
je voudrais que mon aplli permette d'uploader des fichiers depuis le client sur le serveur.
J'ai fait des recherches je sais qu'au niveau du form, il faut mettre le type en muti-part.
Mais comment traiter le champ au niveau e ma servlet.
Je n'ai pas trouver en fait les classes qui me permettent de le manipuler.
 
Merci de m'indiquer une solution

Reply

Marsh Posté le 24-08-2004 à 12:17:32   

Reply

Marsh Posté le 24-08-2004 à 13:05:32    

Reply

Marsh Posté le 24-08-2004 à 14:38:14    

oui mais j'utilise pas apache.
je suis sous IIS et mon moteur de servlet est REsin

Reply

Marsh Posté le 24-08-2004 à 15:13:52    

ca n'a rien avoir avec le serveur HTTP apache ... apache c'est une organisation dont le serveur HTTP n'est qu'un des très (très très) nombreux projets.
 
le truc dont je t'ai filé le lien fonctionne avec n'importe quel moteur de servlet, dont Resin ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 31-08-2004 à 10:28:24    

Bonjour,
 
j'utilise ce package mais j'ai un problème lors de la reception de la requete. L'exception "the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is null" est levée lors de l'execution de:
List fileItems = fu.parseRequest(req);
 
Quequ'un a déjà eu ce problème et peut m'aider?
 
Merci d'avance
Cédric
 
Voici un extrait de mon code:
<HTML>
  <HEAD>
    <TITLE>Accueil</TITLE>
  </HEAD>
  <BODY BGCOLOR="#FDF5E6">
    <H1 ALIGN="CENTER">Enregistrer un fichier sur le serveur</H1>
    <FORM ACTION="./uploader" METHODE="POST" ENCTYPE="multipart/form-data">
      S&eacute;lectionnez le(s) fichier(s) que vous souhaitez uploader.<br><br>
      FICHIER1 : <INPUT TYPE="file" NAME="monFichier"><br>
      <INPUT TYPE="submit" VALUE="Envoyer !">
    </FORM>
  </BODY>
</HTML>
 
et la méthode appelée par doPost de ma servlet:
public boolean gererFichiers(HttpServletRequest req) {
  try {
     
    DiskFileUpload fu = new DiskFileUpload();
    fu.setSizeMax(1024 * 512); // 512 K
    fu.setSizeThreshold(4096);
    fu.setRepositoryPath("C:\\WUTemp" );
     
    List fileItems = fu.parseRequest(req);
    if (fileItems == null) {
       return false;
    }
     
    //Iteration sur chaque fichier (au cas ou je modifie le HTML et ajoute plusieurs transferts)  
    Iterator i = fileItems.iterator();
    FileItem enCours= null;
     
    while (i.hasNext()) {
      enCours = (FileItem) i.next();
      String fileName = enCours.getName();
                     
      File fichier = new File(fileName);
 
      fichier = new File("C:\\WUTemp\\" + fichier.getName());
 
      enCours.write(fichier);
    }
             
  } catch (Exception e) {
      System.out.println("Erreur de l'application " + e.getMessage());
      return false;
    }
 
  return true;
  }

Reply

Marsh Posté le 31-08-2004 à 13:38:02    

bonjour,

Code :
  1. /**
  2. * Classe implémentant l'interface <code>javax.activation.DataSource</code>
  3. * pour des objets du type <code>javax.servlet.http.HttpServletRequest</code>.
  4. * <p>Cet objet permet d'initialiser l'analyseur MIME
  5. * <code>javax.mail.internet.MimeMultipart</code> de l'API JavaMail.
  6. * L'intérêt est de pouvoir récupérer des fichiers uploadés dans une requête HTTP POST,
  7. * ce qui est malheureusement impossible avec l'API Servlet.</p>
  8. * <p>On peut alors écrire quelque chose comme ça :<pre>
  9. * HttpRequestDataSource ds = new HttpRequestDataSource(request);
  10. * MimeMultipart mp = new MimeMultipart(ds);
  11. * MimeBodyPart bp = (MimeBodyPart) mp.getBodyPart(0);</pre></p>
  12. */
  13. public class HttpRequestDataSource implements DataSource{
  14. /**
  15. * Référence sur la requête.
  16. */
  17. private HttpServletRequest request;
  18. /**
  19. * Constructeur standard.
  20. */
  21. public HttpRequestDataSource(HttpServletRequest request) {
  22. this.request = request;
  23. }
  24. /**
  25. * Retourne un <code>InputStream</code> sur la requête.
  26. * Cela permet de lire les données de la requête.
  27. * @return un <code>InputStream</code>
  28. */
  29. public InputStream getInputStream() throws IOException {
  30. if (request == null)
  31.  return null;
  32. return request.getInputStream();
  33. }
  34. /**
  35. * Retourne un <code>OutputStream</code> sur la requête.
  36. * Mais comme il ne peut pas y en avoir, cette méthode se
  37. * contente de renvoyer <code>null</code>.
  38. * @return <code>null</code>
  39. */
  40. public OutputStream getOutputStream() throws IOException {
  41. return null;
  42. }
  43. /**
  44. * Retourne le <code>Content-Type</code> de la requête.
  45. * @return la valeur du paramètre <code>Content-Type</code>
  46. */
  47. public String getContentType() {
  48. if (request == null)
  49.  return null;
  50. return request.getContentType();
  51. }
  52. /**
  53. * Retourne un nom pour l'objet.
  54. * @return la chaîne <code>"HttpRequest"</code>
  55. */
  56. public String getName() {
  57. return "HttpRequest";
  58. }
  59. }


 
et dans ta servlet:

Code :
  1. HttpRequestDataSource ds = new HttpRequestDataSource(request);
  2.        Log.trace("DeclarationServlet","doPost()","dataSource des  fichiers  importer = ok" );
  3.        MimeMultipart mp = new MimeMultipart(ds);
  4.        Log.trace("DeclarationServlet","doPost() ","MimeMultipart = ok" );
  5.        MimeBodyPart bp;
  6.        Log.trace("DeclarationServlet","doPost()","MimeMultipart.getCount() = "+mp.getCount());
  7.        for (int i=0; i<mp.getCount(); i++) {
  8.        bp = (MimeBodyPart) mp.getBodyPart(i);
  9.            if (bp.getFileName() != null) {
  10.                Log.trace("DeclarationServlet","doPost()"," file N° "+i+" = "+bp.getFileName() );
  11.                BufferedReader fichier = null;
  12.         if (bp.getContent() instanceof String) {
  13.              Log.trace("DeclarationServlet","doPost()"," file N°"+i+" est un  fichier text " );
  14.                     fichier = new BufferedReader( new StringReader((String) bp.getContent()) );


 
dans ta jsp:

Code :
  1. <form name="importation"  onSubmit="return controlXML();" enctype="multipart/form-data"  action="<%=servletPath%>/ImportationServlet" method="post" >


 
voila ca marche  et java pour tous!
salut

Reply

Marsh Posté le 01-09-2004 à 09:57:02    

Merci bragadocio,
 
je suis en train d'essayer ta méthode mais j'ai 2 questions:  
-je ne dispose pas des Classes : MimeMultipart et MimeBodyPart. Elles proviennent d'un jar que tu as installé?
-Le code lit les fichiers de texte (if (bp.getContent() instanceof String)), comment lire si c'est une image qui est uploadée?
Merci.

Reply

Marsh Posté le 01-09-2004 à 13:09:55    

bonjour,
 
1-
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
j2ee.jar(http://java.sun.com/j2ee/1.4/docs/api/index.html)
 
2- pour une image , laisse tomber le  instanceof String, et remplace le avec un stream ou qlq chose comme ca , a priori ca dois marcher
 
salut

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed