Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# xmlhttprequest et fichiers binaires ...

Envoyé par : Utilisateur anonyme

Date : 24/07/2005 12:21

Voila j'ai déja posté un mail sur la ML de xulfr mais je vais diversifier mes requete parce que les retours ne sont pas nombreux :) et mes recherches sur Google pas franchement fructueuses.

Je suis en train de faire une extentions pour photostation (envoyer un groupe dimage sélectionnées par glissé deposé dans une barre lateral pour faire développer chez photostation via leur site web, et pkoi pas vers d'autre prestataire , je n'ai pas d'action particuliere chez les uns ou les autres :) A un moment je doit copier les image sur mon disque dur.

Donc j'utilise l'objet star du moment xmlhttprequest pour récupérer l'image dont j'ai récupérer l'url par glissé déposé dans ma liste depuis la page web (ça, ça marche tres bien) ...

seulement le contenu de mon fichier binaire est incomplet, et quand je veux afficher mon image, on me répond que les entete sont ivalides ... bref mon contenu binaire est modifié dans xmlhttprequest.responseText

si j'en crois ce qui est là http://lxr.mozilla.org/mozilla/source/extensions/xmlextras/base/src/nsXMLHttpRequest.cpp#568 c'est un conflit avec l'utf8 et les caracteres dont la tete ne lui revient pas ... y a t'il un moyen de contourner cela (sachant que je ne controle pas les site web ou sont les images, vu que c'est sensé etre n'importe lequel) comme avoir par négociation http le contenu en base64 ou si un genre de utf8_decode peu suffire ?

mon source (la partie interressante) :

//création d'un fichier temporaire var file = Components.classes"@mozilla.org/file/directory_service;1"

          .getService(Components.interfaces.nsIProperties)
          .get("TmpD", Components.interfaces.nsIFile);

//basename est un fonction qui retourne le nom du fichier sans le chemin file.append(basename(dropdata.data)); file.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0664);

//ouverture d'un flux d'écriture var foStream = Components.classes"@mozilla.org/network/file-output-stream(..)

         .createInstance(Components.interfaces.nsIFileOutputStream);
          

//recupération du fichier par l'URL xmlhttp.open("GET", dropdata.data); xmlhttp.onreadystatechange=function() {

   if (xmlhttp.readyState == 4) {
       if (xmlhttp.status == 200) {
           // use 0x02 | 0x10 to open file for appending.
           foStream.init(file, 0x02 | 0x10, 0664, 0); 
           //  !!!! /!\ ici j'ai un probleme le contenu de la réponse

est modifié /!\ !!!!

           foStream.write(xmlhttp.responseText,

xmlhttp.responseText.length);

           foStream.close();
       }
   }

} xmlhttp.send(null)

Damien

# Re: xmlhttprequest et fichiers binaires ...

Envoyé par : Utilisateur anonyme

Date : 24/07/2005 12:30

Oups désolé pour la mise en forme :/ je retente :)

var file =Components.classes["@mozilla.org/file/directory_service;1"]
          .getService(Components.interfaces.nsIProperties)
          .get("TmpD", Components.interfaces.nsIFile);
file.append(basename(dropdata.data));
file.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE,0664);
var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
          .createInstance(Components.interfaces.nsIFileOutputStream);
		
//recupération du fichier par l'URL
xmlhttp.open("GET", dropdata.data);
xmlhttp.onreadystatechange=function() {
  if (xmlhttp.readyState == 4) {
    if (xmlhttp.status == 200) {
      foStream.init(file, 0x02 | 0x10, 0664, 0);
      // !!! ici mon probleme le fichier binaire est modifié :/ !!!
      foStream.write(xmlhttp.responseText,xmlhttp.responseText.length);
      foStream.close();
    }
  }
}
xmlhttp.send(null)

# Re: xmlhttprequest et fichiers binaires ...

Envoyé par : Utilisateur anonyme

Date : 26/07/2005 13:59

Donc je me répond a moi même ... (un jour je ferait p.e. un blog ;)

apres 2 jours de recherches je tombe sur http://www.mail-archive.com/mozilla-xpcom@mozilla.org/msg04315.html

et là révélation !!!

mon code devient:

onDrop: function (evt,dropdata,session){
  if (basename(dropdata.data) != '') {
    url = dropdata.data.split("\n")[0];
    try {
      const nsIWBP = Components.interfaces.nsIWebBrowserPersist;

      //création d'un fichier temporaire unique
      var dest = Components.classes["@mozilla.org/file/directory_service;1"]
          .getService(Components.interfaces.nsIProperties)
          .get("TmpD", Components.interfaces.nsIFile);
      dest.append(basename(url));
      dest.createUnique(dest.NORMAL_FILE_TYPE, 0664);
	
      // set up source
      var uri = Components.classes['@mozilla.org/network/standard-url;1']
          .createInstance(Components.interfaces.nsIURI);
      uri.spec = url;

      //envois de la requête en asynchrone
      var persist = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
          .createInstance(Components.interfaces.nsIWebBrowserPersist);
      var flags = nsIWBP.PERSIST_FLAGS_NO_CONVERSION 
          | nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES 
          | nsIWBP.PERSIST_FLAGS_BYPASS_CACHE;
      persist.persistFlags = flags;
      persist.saveURI(uri, null, null, null, null, dest);

      //ajout dans la liste.
      li = document.createElement('listitem');
      li.setAttribute('label',basename(url));
      li.setAttribute('value',dest.path);
      document.getElementById('images').appendChild(li);
    }
    catch (e) {
      log(e.name + " : " + e.message);
    }
  }
}

Voila bonne journée a tous :)

Damien

# Re: xmlhttprequest et fichiers binaires ...

Envoyé par : Utilisateur anonyme

Date : 25/04/2006 10:03

merci beaucoup pour ce source, mais moi ce qui m'intéressé c t juste comment créer un fichier temporaire :D

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.