Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

[APPLET] ECRIRE UN OBJET (SERIALIZE) SUR LE SERVEUR


Information sur la source

Description

j'ai eu besoin de sauvegarder un objet serialisé dans un fichier a partir d'un applet java! et la solution qui consiste a mettre en place un servlet m'etais impossible et trop lourde! alors avec 2 methode et un petit fichier PHP cela est possible :
 

Source

  • //methode java qui envoi l'objet serialisé dans une requette HTTP POST sur le serveur!
  • * public void saveList(){
  • *
  • * ObjectOutputStream out;
  • * BufferedReader reader;
  • * HttpURLConnection cnx;
  • *
  • * try{
  • * // nom du fichier qui va recevoir l'objet serialisé a ecrire
  • * URL url = new URL(getCodeBase(),"writeobject.php");
  • * cnx = (HttpURLConnection) url.openConnection();
  • * cnx.setRequestMethod("POST");
  • *
  • * cnx.setDoInput(true);
  • * cnx.setDoOutput(true);
  • * cnx.connect();
  • *
  • * out = new ObjectOutputStream(cnx.getOutputStream());
  • *
  • * // objet a serialiser :
  • * out.writeObject(monObjet);
  • *
  • * reader = new BufferedReader(new InputStreamReader(cnx.getInputStream()));
  • * String ligne;
  • * while ((ligne = reader.readLine()) != null) {
  • * System.out.println(ligne);
  • * }
  • *
  • * out.flush();
  • * out.close();
  • * reader.close();
  • * cnx.disconnect();
  • * }
  • * catch(Exception e){
  • * e.printStackTrace();
  • * }
  • * }
  • // fichier php qui recupere le contenu POST de la requete et qui l'ecrit dans un fichier :
  • * <?php
  • *
  • * // nom du fichier qui recevra l'objet serialisé
  • * $fp = fopen("objectserialized.cmi","w");
  • * /*
  • * il faut activer cette option dans php.ini pour activer la
  • * variable $HTTP_RAW_POST_DATA qui retourne l'entete RAW POST!
  • *
  • * ; Always populate the $HTTP_RAW_POST_DATA variable.
  • * always_populate_raw_post_data = On
  • *
  • * */
  • * fwrite($fp,$HTTP_RAW_POST_DATA);
  • * fclose($fp);
  • *
  • * ?>
  • // methode java qui va chercher le fichier ecrit par php et qui recrée lobjet :)
  • * public Object loadList(){
  • *
  • * Object cp = null;
  • * ObjectInputStream in;
  • * HttpURLConnection cnx;
  • *
  • * try{
  • * // ouverture du fichier qui contient l'objet serialisé
  • * URL url = new URL(getCodeBase(),"objectserialized.cmi");
  • * cnx = (HttpURLConnection) url.openConnection();
  • *
  • * in = new ObjectInputStream(cnx.getInputStream());
  • *
  • * // creation de l'objet (cast)
  • * cp = (Object)in.readObject();
  • * in.close();
  • * cnx.disconnect();
  • * }
  • * catch(Exception e){
  • * e.printStackTrace();
  • * }
  • * return cp;
  • * }
 //methode java qui envoi l'objet serialisé dans une requette HTTP POST sur le serveur!
    * public void saveList(){
    *
    *     ObjectOutputStream out;
    *     BufferedReader reader;
    *     HttpURLConnection cnx;
    *             
    *     try{
    *         // nom du fichier qui va recevoir l'objet serialisé a ecrire
    *              URL url = new URL(getCodeBase(),"writeobject.php");
    *              cnx = (HttpURLConnection) url.openConnection();
    *             cnx.setRequestMethod("POST");
    *                                      
    *                 cnx.setDoInput(true);
    *             cnx.setDoOutput(true);
    *             cnx.connect();
    *
    *         out = new ObjectOutputStream(cnx.getOutputStream());
    *         
    *                 // objet a serialiser :
    *                 out.writeObject(monObjet);
    *             
    *             reader = new BufferedReader(new InputStreamReader(cnx.getInputStream()));
    *              String ligne;
    *               while ((ligne = reader.readLine()) != null) {
    *                  System.out.println(ligne);
    *               }         
    *
    *              out.flush();
    *         out.close();
    *               reader.close();
    *                 cnx.disconnect();
    *           }
    *           catch(Exception e){
    *               e.printStackTrace();    
    *           }
    * }

// fichier php qui recupere le contenu POST de la requete et qui l'ecrit dans un fichier :
    * <?php
    *
    * // nom du fichier qui recevra l'objet serialisé
    * $fp = fopen("objectserialized.cmi","w");
    * /*
    * il faut activer cette option dans php.ini pour activer la
    * variable $HTTP_RAW_POST_DATA qui retourne l'entete RAW POST!
    *
    * ; Always populate the $HTTP_RAW_POST_DATA variable.
    * always_populate_raw_post_data = On
    *
    * */
    * fwrite($fp,$HTTP_RAW_POST_DATA);
    * fclose($fp);
    *
    * ?>


// methode java qui va chercher le fichier ecrit par php et qui recrée lobjet :)
    * public Object loadList(){
    *         
    *     Object cp = null;
    *     ObjectInputStream in;
    *     HttpURLConnection cnx;
    *         
    *     try{
    *            // ouverture du fichier qui contient l'objet serialisé
    *         URL url = new URL(getCodeBase(),"objectserialized.cmi");
    *         cnx = (HttpURLConnection) url.openConnection();
    *         
    *         in = new ObjectInputStream(cnx.getInputStream());
    *         
    *         // creation de l'objet (cast)
    *         cp = (Object)in.readObject();
    *         in.close();
    *         cnx.disconnect();
    *     }
    *           catch(Exception e){
    *               e.printStackTrace();    
    *           }
    *           return cp;
    * }

Conclusion

voila, seul la gestion des exceptions est a perfectionner!
et bien penser a editer le fichier php.ini pour permettre la capture RAW de l'entete http POST
 

Commentaires et avis

signaler à un administrateur
Commentaire de hianha le 13/01/2005 17:55:08

j'aimerais creer un programme permettant de chercher les photo directement dans le disque dur d'un client.
DITES moi s'il VOUS PLAIT COMMENT FAIRE POUR QUE ça marche.
en fait j'ai d'abord creer quatres applets qui permettront de visualiser,filtrer,choisir et trier.
il me manque une methode réunissant les quatres autres et faire marcher mon programme.
(voici mon programme)il doit permettre à un client de chercher des photos dans son disque dur

signaler à un administrateur
Commentaire de psyjc le 13/01/2005 18:02:23

bonsoir,
tous dabord ton message n'a aucun lien avec ma source! ma source permet d'ecrire un objet serializé sur le serveur a partir d'un applet!
de plus j'ai pas vraiment compris ton probleme. Tu aura plus de chances d'etre aidé si tu le poste plutot sur le forum!
en dernier lieu , evite de forcer sur le bouton ::Ajouter Votre Commentaire:: :)

signaler à un administrateur
Commentaire de docv266 le 19/02/2007 14:49:11

Bonjour.
Mon problème est proche du tien.
Je doit transmettre un entier à partir de mon applet, jusqu'à un fichier php qui ensuite le traite.
J'ai utilisé ton code (merci d'ailleurs) mais j'ai une erreur! J'ai remplacé "monObjet" par mon entier.
Voilà l'erreur : java.lang.ClassCastException: sun.net.www.protocol.file.FileURLConnection
Et le contenu du fichier php qui recupere mon entier :
$var=$HTTP_RAW_POST_DATA;

$fichier = "fichier.txt";
$inF = fopen($fichier,"a+");
fputs($inF,$var);
fclose($inF);

Peux tu m'aider?
merci

signaler à un administrateur
Commentaire de psyjc le 19/02/2007 15:30:06

un INT n'est pas un objet. tu ne peux donc pas appliquer des methodes demandant des objets. (d'ou ton probleme de cast). Soit tu met ton int dans un objet, soit tu modifie les fonctions par un truc qui ressemblerait a ca :
out = new OutputStream(cnx.getOutputStream());
out.write(MonInt);


(apres coup je me dis que ca reste quand meme une methode bien porcasse et qu'il doit yavoir plus propre et plus simple pour faire la meme chose..)

signaler à un administrateur
Commentaire de docv266 le 19/02/2007 17:53:29

Merci de m'accorder du temp.
Je pense que ton idée de mettre mon entier dans un objet est bonne.
Cependant connais tu un moyen pour récupérer cet entier en php, puisque c'est là que je veut manipuler ma variable?
Je suis un débutant, tu l'auras compris, et j'ai une autre question :
Pour mettre mon entier dans un objet je dois créer une classe dont l'un des attributs est un entier c'est ça?

Merci d'avance.

signaler à un administrateur
Commentaire de psyjc le 19/02/2007 18:00:02

Si tu veux juste passer un entier et le recuperer vers PHP tu peux faire beaucoup plus simple.
Par exemple en java tu fais un GET vers ta page PHP avec en param ton entier.
Du cote de PHP tu fais un simple $_GET['MonInt'].

Ca fait pas mal de temps que jai laisse tomber le java pour des choses plus saines. je ne pourrai pas t'en dire plus.

signaler à un administrateur
Commentaire de docv266 le 19/02/2007 18:49:51

La méthode GET est celle que j'ai en ce moment, mais justement je veut changer car je veut pas que les utilisateurs puisse voir cette valeur, d'où le POST...
Je ne veut pas t'ennuyer, si tu veux j'arrete de te poser des questions.

Voilà ou j'en suis :

J'ai une classe "entier" dans laquelle le conctructeur affecte un entier simplement.
Je crée une instance de cette classe et je la sérialize à l'aide de ton code.
Cependant ça ne marche toujours pas? Aurais tu une suggestion?
Sinon, merci pour tout quand même. :-)

signaler à un administrateur
Commentaire de psyjc le 19/02/2007 19:23:27

Que tu passe par Post ou par Get, tes data passeront en clair..
Par contre si tu passe un objet sérialisé, tu risque d'avoir quelques soucis pour la lire coté PHP... Et la je vois pas comment faire.
Le plus simple c'est que tu passe ton entier simplement par Get (ou Post au choix).

signaler à un administrateur
Commentaire de brahimaitsaad le 26/05/2009 20:30:21

j'ai un  problem si quelqu'un a une solution n'hisiter pas


en fait j'ai un applet qui envoi un fichier xml a une servlet j'ai utilisé la methode post  mais je sais pas pourquoi il n'y a pas de communication entre les deux
c a dire  la servlet n'enregistre pas le fichier envoyé

voici mon code ;
code applet :
String xmlfile = "C:\\Documents and Settings\\admin\\Bureau\\xmlenvoye.xml";
try{
      
URL urlservlet = new URL(getDocumentBase(),"ReceptionXml");
            // BufferedReader reponse = new BufferedReader (new InputStreamReader(urlservlet.openStream())); HttpURLConnection connexion = (HttpURLConnection)urlservlet.openConnection();    connexion.setRequestMethod("POST");
     connexion.setDoInput(true);
    connexion.setDoOutput(true);
     connexion.setUseCaches(false);
// DEBUT Script pour envoyer fichier de Programme vers servlet
File fFichierOrigProg = new File(xmlfile);
long lengthFichierOrigProg = fFichierOrigProg.length();          
byte[] tabByteFichierOrigProg = new byte[(int) lengthFichierOrigProg];    
// Creation d'un byte[] correspondant au fichier a envoye
FileInputStream fisOrigProg = new FileInputStream(xmlfile);     fisOrigProg.read(tabByteFichierOrigProg);
                    
fisOrigProg.close();
connexion.setRequestProperty("Content-Type","application/octet-stream");
// Envoi de fichier (sous forme de byte[]) vers la servlet
OutputStream outProg  = new ObjectOutputStream(connexion.getOutputStream());
     // OutputStream outProg = connexion.getOutputStream();
outProg.write(tabByteFichierOrigProg, 0, tabByteFichierOrigProg.length);
                outProg.flush();
     outProg.close();

// FIN Script pour envoyer fichier de Programme vers servlet
    
code servlet :

public class ReceptionXml extends HttpServlet {

public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
  InputStream instrServlet = req.getInputStream();
byte[] tabByteFichierRecupParServlet = new byte[instrServlet.available()];
instrServlet.read(tabByteFichierRecupParServlet);
instrServlet.close();
// Ecriture du fichier sur le serveur

File cibleServeur = new
//j'enregistre mon fichier dans un autre emplacelment
File("C:\\Documents and Settings\\admin\\Bureau\\xmlreçu.Xml");
FileOutputStream fos = new FileOutputStream(cibleServeur);
fos.write(tabByteFichierRecupParServlet);
fos.close();
    }}
merci d'avance

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,234 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.