après un upload réalisé avec succès, le fichier manipulé reste bloqué, sous windows (pas encore testé sous ubuntu).
D'une part, je ne suis pas sûr de l'ouvrir en lecture seule et d'autre part la fermeture ne se fait pas à l'endroit demandé : je reste figé pendant des lustres .
Ci-après le code qui fonctionne :
Code : Tout sélectionner
const BOUNDARY = "xofxonxof"; //ce qui va nous servir de délimiteur
const MULTI = "@mozilla.org/io/multiplex-input-stream;1";
const FINPUT = "@mozilla.org/network/file-input-stream;1";
const STRINGIS = "@mozilla.org/io/string-input-stream;1";
const BUFFERED = "@mozilla.org/network/buffered-input-stream;1";
const XPC = "UniversalXPConnect";
const FP = "@mozilla.org/filepicker;1";
const FL = "@mozilla.org/file/local;1";
const MIME = "@mozilla.org/mime;1";
const HASH = "@mozilla.org/security/hash;1";
const nsIMultiplexInputStream = Components.interfaces.nsIMultiplexInputStream;
const nsIFileInputStream = Components.interfaces.nsIFileInputStream;
const nsIStringInputStream = Components.interfaces.nsIStringInputStream;
const nsIBufferedInputStream = Components.interfaces.nsIBufferedInputStream;
const nsIFilePicker = Components.interfaces.nsIFilePicker;
const nsiLocalFile = Components.interfaces.nsILocalFile;
const nsICryptoHash = Components.interfaces.nsICryptoHash;
const nsIMIMEService = Components.interfaces.nsIMIMEService;
//const sl="\r\n";
const sl="\n";
Code : Tout sélectionner
function fa_fichier_lit_et_envoie(vv_script,vv_callback,vv_fichier) {
try {
netscape.security.PrivilegeManager.enablePrivilege(XPC);
} catch (e) {
alert("Vous n'avez pas l\'autorisation de lire des fichiers!!");
return null;
}
// Piqué ici : http://xulfr.org/wiki/ApplisWeb/Request
var file = Components.classes[FL].createInstance(nsiLocalFile);
file.initWithPath(vv_fichier);
if ( file.exists() != true) {
alert("Le fichier "+vv_fichier+" n'existe pas");
return null;
}
var mis = Components.classes[MULTI].createInstance(nsIMultiplexInputStream);
var fin = Components.classes[FINPUT].createInstance(nsIFileInputStream);
Code : Tout sélectionner
fin.init(file, 0x01, 0444, null);
Code : Tout sélectionner
var hsis = Components.classes[STRINGIS].createInstance(nsIStringInputStream);
var buf = Components.classes[BUFFERED].createInstance(nsIBufferedInputStream);
var endsis = Components.classes[STRINGIS].createInstance(nsIStringInputStream);
buf.init(fin, 4096);
var vl_c_disp00='Content-Disposition: form-data;name="addfile"'+sl+sl;
var vl_c_disp01='Content-Disposition: form-data;name="filename";filename="'+file.leafName+'"'+sl;
var typefromfile="";
//try {typefromfile=Components.classes[MIME].getService(nsIMIMEService).getTypeFromFile(file);} catch(e) {alert(e);fa_gid("tb_descriptif_sommaire").value=e;typefromfile="bizarre";}
//try {typefromfile=Components.classes[MIME].getService(nsIMIMEService).getTypeFromExtension(file);} catch(e) {alert(e);fa_gid("tb_descriptif_sommaire").value=e;typefromfile="bizarre";}
try {typefromfile=Components.classes[MIME].getService(nsIMIMEService).getTypeFromFile(file);} catch(e) {typefromfile="bizarre";}
var vl_c_type='Content-Type: ' + typefromfile + sl+sl;
var sheader = new String();
sheader += sl;
sheader += "--" + BOUNDARY + sl;
sheader += vl_c_disp00;
sheader += sl + "--" + BOUNDARY + sl;
sheader += vl_c_disp01;
sheader += vl_c_type;
hsis.setData(sheader, sheader.length);
var endsis = Components.classes[STRINGIS].createInstance(nsIStringInputStream);
var bs = new String(sl+'--' + BOUNDARY + '--'+sl);
endsis.setData(bs, bs.length);
mis.appendStream(hsis);
mis.appendStream(buf);
mis.appendStream(endsis);
var xmlr = new XMLHttpRequest();
xmlr.open("POST", vv_script, true);
xmlr.setRequestHeader("Content-Length", mis.length );
xmlr.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
//xmlr.onreadystatechange=function() {if(xmlr.readyState==4) {if(vv_callback!=""){vv_callback(xmlr.responseText,xmlr.responseText.length);}}};
//xmlr.onreadystatechange=function() {if(xmlr.readyState==4) {if(vv_callback!=""){alert(xmlr.responseText);vv_callback(xmlr.responseText,xmlr.responseText.length);}}};
La ligne suivante bloque entre le "alert" et le lancement de la procédure de traitement de retour. Bloque donc sur le "fin.close();"
Code : Tout sélectionner
xmlr.onreadystatechange=function() {if(xmlr.readyState==4) {if(vv_callback!=""){alert(xmlr.responseText);fin.close();vv_callback(xmlr.responseText,xmlr.responseText.length);}}};
xmlr.send(mis);
return 'ok';
}
--
Cordialement,
Christophe Charron
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3