Upload de fichiers par HTTP

Upload de fichiers par HTTP - Java - Programmation

Marsh Posté le 05-03-2007 à 23:49:54    

Bonjour,

 

Je suis en train d'écrire une petite applet pour me permettre d'uploader un fichier sur un serveur, et ceci par http.
En gros l'applet se charge et permet de sélectionner un (pour le moment) ou plusieurs fichier (plus tard si tout va bien) qui seront ensuite envoyés vers une page php qui finira le traitement normalement.
Mon problème est que pour le moment, quand j'envoie le fichier il est considéré comme une variable POST et non pas comme un FILE. J'ai cherché à definire le enctype mais pour le moment je n'arrive pas.
En regardant sur le net j'ai vu pas mal de fois des références à struts, mais ne l'ayant jamais utilisé je préférerais rester sur quelque chose de plus "simple" si c'est possible.

 

Edit: Autre chose, n'ayant pratiquement jamais dépassé le stade du hello world dans les applet, il y a une phrase qui me pose quelques problèmes dans la doc : Applets cannot load libraries or define native methods.
Donc dans mon applet, je n'ai ni le droit d'utiliser des lib (autres que java.*) ni des classes "custom" que j'ai écrites moi même?? :heink: Il n'y a aucun moyen de contourner ? :heink:

 

Et en fin :
Il me faudrait une façon de pouvoir visualiser le pourcentage de fichier transféré. J'ai pensé à un progressMonitor pour l'affichage et demander toutes les X secondes au serveur quelle taille fait le fichier ... Mais c'est lourd et je pense qu'il doit y avoir plus facile.

 

Merci beaucoup pour vos réponses

 

Esox


Message édité par esox_ch le 06-03-2007 à 00:58:57

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 05-03-2007 à 23:49:54   

Reply

Marsh Posté le 06-03-2007 à 10:30:44    

Une applet non signé ne peut pas lire ton filesystem.
Sinon
http://www.theserverside.com/tt/ar [...] FileUpload
Ils utilisent une librairie bien pratique qui est httpclient d'Apache.
Par contre je ne sais pas si tu pourras user d'un ProgressMonitor
 
Pour l'usage d'un ProgressMonitor, la stratégie est :
1) Tu connais la taille totale du fichier que tu dois envoyer
2) tu lis sequentiellement ton fichier physique  en le copiant dans ton flux reseau, donc tu peux faire progresser ta barre au fur et mesure que tu écris dans ton outputstream qui fait la liaison reseau entre ton applet et le serveur HTTP.

Reply

Marsh Posté le 06-03-2007 à 12:32:31    

merci.  
Mais j'ai encore 2 questions :  
 
-  Est-ce que ce systeme d'envoyer X bytes toutes les Y secondes n'est pas imprécis? Car je ne saurai jamais si j'en envoie trop ou trop peu non?
- Comment faire pour inclure cette classe d'apache dans l'applet? Car si je mets juste l'applet sur une page, il va me dire qu'il ne trouve pas la lib (normal vu que je ne l'ai pas dans le path de la jre de mon browser, au meme titre que les autres personnes qui visiteront la page). J'ai entendu parlé du fait qu'on pourrait le faire avec un jar, mais je repete ma totale inexperience dans la matière :D
 
Merci beaucoup


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 06-03-2007 à 14:15:26    

1) je ne comprends pas ta question
 Tu auras un bout de code qui ressemble à ca  

Code :
  1. myProgressBar.setMinimum(0);
  2. myProgressBar.setMaximum(fileToUpload.length());
  3. .....
  4. while((nbChars=inputStreamFile.read(buffer))>0)
  5. {
  6.    outputStreamToServer.write(buffer, 0, nbChars);
  7.    myProgressBar.setValue(myProgressBar.getValue() + nbChars)
  8. }


C'est du quick and dirty mais l'idée est là
 
2) J'ai oublié comment faire (6 ans que j'ai pas codé une applet) ,mais je suis sur qu'il y a moyen quitte à faire une bidouille horrible (jar des lib dans le jar de l'applet)le jar de l'applet)

Reply

Marsh Posté le 06-03-2007 à 17:43:36    

Salut,
1) Le projet fileUpload est fait pour être utilisé avec des servlets non? Est-ce utilisable même si je n'ai pas de serveur tomcat? 1

 

2) J'ai pensé aussi à faire qqch du genre mais pas réussi, est-ce que qqn peut m'éclairer?:D


Message édité par esox_ch le 06-03-2007 à 17:49:39
Reply

Marsh Posté le 06-03-2007 à 18:22:21    

1) Le projet fileupload est fait pour être utilisé coté serveur et pas coté client.
2) poste ton code

Reply

Marsh Posté le 06-03-2007 à 18:42:14    

Salut,
Donc j'ai une classe VideoUploader qui à un certain moment defini un filtre, ce qui me permet de pouvoir afficher seulement les fichiers dont le Mime est celui que je veux.
Ce filtre est la classe ci dessous, et celle qui a besoin de classes additionnelles:

 
Code :
  1. import javax.activation.MimetypesFileTypeMap;
  2. import javax.swing.filechooser.FileFilter;
  3. import java.io.File;
  4. import java.util.ArrayList;
  5. public class MediaFilter extends FileFilter {
  6.     private ArrayList allowedMime;
  7.     public MediaFilter() {
  8.         allowedMime = new ArrayList();
  9.         allowedMime.add("video/x-msvideo" );
  10.         allowedMime.add("image/png" );
  11.         allowedMime.add("ccc" );
  12.     }
  13.     public boolean accept(File file) {
  14.         if (file.isDirectory())
  15.             return true;
  16.             return allowedMime.contains(getFileMime(file));
  17.     }
  18.     private String getFileMime(File file){
  19.    
  20.         System.out.print("Name" + file.getName() + " Mime :" );
  21.         System.out.println(new MimetypesFileTypeMap().getContentType(file));
  22.         return new MimetypesFileTypeMap().getContentType(file);
  23.     }
  24.     public String getDescription() {
  25.         return "Filtre permettant uniquement les video (avi, rm,...)";
  26.     }
  27. }
 

Ce que j'ai essayé c'est de faire un jar avec mes 3 classes et le jar de la librairie activator... mais il ne la trouve toujours pas :(

 

Sinon à part ça qqn a une idée du comment je peux faire pour envoyer mes trucs avec le bon enctype? De la sorte que ça soit recuperable via file et non pas via post?


Message édité par esox_ch le 06-03-2007 à 18:43:03

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 07-03-2007 à 10:31:39    

Salut,

 

Donc apperemment mon classPath était pas bien setté ...
Maintenant quand je fais appletviewer maPage.html je recois aucune erreur, ni aucun output :D
Edit: Vraisemblablement il faudrait que je passe par un htmlconverter même si je suis sous linux ... Bizard

 

Ce qui m'inquiete un peu pour ta manière de faire avec le while sur l'inputStreamFile, c'est que j'ai l'impression que le while va tourner "a la vitesse de lectrue du fichier" et non pas à celle d'envoie des données non?


Message édité par esox_ch le 07-03-2007 à 10:39:11
Reply

Marsh Posté le 07-03-2007 à 10:50:00    

Y a une synchronisation.
Tu lis une "sequence" dans ton fichier et tu écris cette séquence dans ton stream connecté au serveur. et tu recommences.  Ces 2 opérations sont effectuées séquentiellement donc pas de problème.
De plus la lecture locale du fichier est beaucoup plus rapide que l'envoi du fichier.


Message édité par phnatomass le 07-03-2007 à 11:26:54
Reply

Marsh Posté le 07-03-2007 à 10:56:40    

D'accord merci, alors je vais faire comme ça :D
 
Par contre tu as pas une idée de comment je pourrais faire pour envoyer ce document en sachant que la seule chose que j'ai à disposition sur le serveur c'est un serveur http apache ? Et donc pas de possibilité d'utiliser des modules liés à tomcat ?
 
Merci beaucoup pour tout ton aide !

Reply

Marsh Posté le 07-03-2007 à 10:56:40   

Reply

Marsh Posté le 08-03-2007 à 11:08:55    

HTTP  PUT ?
Envoi par FTP ?

Reply

Sujets relatifs:

Leave a Replay

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