Manipulation du système de fichier local en javascript (ie et mozilla)

Soyez le premier à donner votre avis sur cette source.

Vue 22 482 fois - Téléchargée 985 fois

Description

Voici une suite de fonctions javascript compatibles Internet Explorer et Mozilla, qui permettent de créer, lire ou copier des fichiers en locale, ainsi que de manipuler le texte du presse papier (voir zip).

Source / Exemple :


var MSIE4 = ((navigator.appName=="Microsoft Internet Explorer") && ( navigator.appVersion.substring(0,1)=="4"));

if (MSIE4) {
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  compatible = "Internet Explorer 4";
}

/** renvoi true si le navigator est Microsoft Internet Explorer @return {boolean}   */
function isMSIE4() {
  return MSIE4;
}

var mozex_default_tmpdir = "/tmp";  /* unix */
var mozex_dir_separator = '/';      /* unix */
var mozex_os = 'unix';              /* unix */
if (window.navigator.platform.toLowerCase().indexOf("win") != -1) {
    mozex_default_tmpdir = "C:\\windows\\temp";     /* windows */
    mozex_dir_separator = '\\';                     /* windows */
    mozex_os = 'win';                               /* windows */
} 

/** renvoi uri de la page courante @return {string}   */
function basename(uri) {
  uri = uri.substring(1, uri.lastIndexOf('/'));
  return uri;
}
/** renvoi le chemin locale de la fpage courante @return {string}   */
function getPath() {
  var currentDir;
  var url = unescape(self.location.pathname);  
  if (isMSIE4()) {
    currentDir = fso.GetParentFolderName(url).substr(1);
  } else {
    currentDir = (basename(url));
  }
  return currentDir;
}
/** Copie d'un fichier 
	@param {string} srcFile Chemin du fichier source (ex: C:\image.jpg)
	@param {string} dstFile Chemin du fichier destination (ex: C:\image2.jpg), écraser s'il existe

  • /
function copyFile(srcFile,dstFile,overwrite) { if (isMSIE4()) { fso.CopyFile(srcFile,dstFile,overwrite); } else { copyFolderMozilla(srcFile,dstFile,overwrite); } } /** Sauvergarde d'un texte dans un fichier @param {string} content Contenus à sauver @param {string} filename Chemin du fichier destination (ex: C:\texte.txt), écraser s'il existe
  • /
function saveToFile(content,filename) { if (isMSIE4()) { saveToFileMSIE(content,filename); } else { saveToFileMozilla(content,filename); } } /** Chargement du contenus d'un fichier dans une chaine @param {string} filename Chemin du fichier à cahrger (ex: C:\texte.txt) @return {string} Contenus du fichier
  • /
function loadFromFile(filename) { var str; if (isMSIE4()) { str = loadFromFileMSIE(filename); } else { str = loadFromFileMozilla(filename); } return str; } /** Sauvergarde, sous IE, d'un texte dans un fichier @param {string} content Contenus à sauver @param {string} filename Chemin du fichier destination (ex: C:\texte.txt), écraser s'il existe
  • /
function saveToFileMSIE(content,filename) { try { var ts = fso.CreateTextFile(filename); ts.Write(content); ts.Close(); } catch(e) { document.write("Exception in saveToFileMSIE"); } } /** Chargement, sous IE, du contenus d'un fichier dans une chaine @param {string} filename Chemin du fichier à cahrger (ex: C:\texte.txt) @return {string} Contenus du fichier
  • /
function loadFromFileMSIE(filename) { try { var ts; var str = ''; if (fso.FileExists(filename)) { ts = fso.OpenTextFile(filename,1,false); str = ts.ReadAll(); ts.Close(); } return (str); } catch(e) { document.write("Exception in loadFromFileMSIE"); } } /** Sauvergarde, sous Mozilla, d'un texte dans un fichier @param {string} content Contenus à sauver @param {string} filename Chemin du fichier destination (ex: C:\texte.txt), écraser s'il existe
  • /
function saveToFileMozilla(content,filename) { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); } catch (e) { alert("Permission to save file was denied."); } var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); filename = filename.replace(/\//gi,mozex_dir_separator); file.initWithPath( filename ); if ( file.exists() == false ) { file.create( Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 420 ); } var outputStream = Components.classes["@mozilla.org/network/file-output-stream;1"] .createInstance( Components.interfaces.nsIFileOutputStream ); /* Open flags #define PR_RDONLY 0x01 #define PR_WRONLY 0x02 #define PR_RDWR 0x04 #define PR_CREATE_FILE 0x08 #define PR_APPEND 0x10 #define PR_TRUNCATE 0x20 #define PR_SYNC 0x40 #define PR_EXCL 0x80
  • /
/*
    • File modes ....
    • CAVEAT: 'mode' is currently only applicable on UNIX platforms.
    • The 'mode' argument may be ignored by PR_Open on other platforms.
    • 00400 Read by owner.
    • 00200 Write by owner.
    • 00100 Execute (search if a directory) by owner.
    • 00040 Read by group.
    • 00020 Write by group.
    • 00010 Execute by group.
    • 00004 Read by others.
    • 00002 Write by others
    • 00001 Execute by others.
  • /
outputStream.init( file, 0x04 | 0x08 | 0x20, 420, 0 ); var result = outputStream.write( content, content.length ); outputStream.close(); } /** Chargement, sous Mozilla, du contenus d'un fichier dans une chaine @param {string} filename Chemin du fichier à cahrger (ex: C:\texte.txt) @return {string} Contenus du fichier
  • /
function loadFromFileMozilla(filename) { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); } catch (e) { alert("Permission to read file was denied."); } var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); filename = filename.replace(/\//gi,mozex_dir_separator); file.initWithPath( filename ); if ( file.exists() == true ) { var is = Components.classes["@mozilla.org/network/file-input-stream;1"] .createInstance( Components.interfaces.nsIFileInputStream ); is.init( file,0x01, 00004, null); var sis = Components.classes["@mozilla.org/scriptableinputstream;1"] .createInstance( Components.interfaces.nsIScriptableInputStream ); sis.init( is ); return sis.read( sis.available() ); } else { return ''; } } /** Copie, sous Mozilla, d'un fichier @param {string} srcFile Chemin du fichier source (ex: C:\image.jpg) @param {string} dstFile Chemin du fichier destination (ex: C:\image2.jpg), écraser s'il existe
  • /
function copyFileMozilla(srcFile, dstFile) { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); } catch (e) { alert("Permission to read file was denied."); } var ios = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); var pngFile = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); srcFile = srcFile.replace(/\//gi,mozex_dir_separator); pngFile.initWithPath(srcFile); var istream = Components.classes["@mozilla.org/network/file-input-stream;1"] .createInstance(Components.interfaces.nsIFileInputStream); istream.init(pngFile, -1, -1, false); var bstream = Components.classes["@mozilla.org/binaryinputstream;1"] .createInstance(Components.interfaces.nsIBinaryInputStream); bstream.setInputStream(istream); var bytes = bstream.readBytes(bstream.available()); // pngBinary already exists var aFile = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); dstFile = dstFile.replace(/\//gi,mozex_dir_separator); aFile.initWithPath( dstFile ); aFile.createUnique( Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 600); var stream = Components.classes["@mozilla.org/network/safe-file-output-stream;1"] .createInstance(Components.interfaces.nsIFileOutputStream); stream.init(aFile, 0x04 | 0x08 | 0x20, 0600, 0); // write, create, truncate stream.write(bytes, bytes.length); if (stream instanceof Components.interfaces.nsISafeOutputStream) { stream.finish(); } else { stream.close(); } return bytes; } function copyFolderMozilla(sourceFolder,destFolder,overwrite) { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); } catch (e) { alert("Permission to read file was denied."); } var destParentFolder = getParentFolder(destFolder); var destFolderName = getFolderName(destFolder); sourceFolder = sourceFolder.replace(/\//gi,mozex_dir_separator); destFolder = destFolder.replace(/\//gi,mozex_dir_separator); destParentFolder = destParentFolder.replace(/\//gi,mozex_dir_separator); destFolderName = destFolderName.replace(/\//gi,mozex_dir_separator); // récupérer un composant pour le fichier à copier var aFile = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); if (!aFile) return false; // récupérer un composant pour le répertoire où la copie va s'effectuer. var aDir = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); if (!aDir) return false; // ensuite, on initialise les chemins aFile.initWithPath(sourceFolder); aDir.initWithPath(destParentFolder); // Au final, on copie le dossier en le renommant if( !fileExists(destFolder) || overwrite ) { // S'il n'existe pas, ou si on peut l'écraser on le copie aFile.copyTo(aDir,destFolderName); } } //------------------------------------------------------------------------------ function getFileBrowser( dirName ) { if (MSIE4) { return getFileBrowserMSIE( dirName ); } else { return getFileBrowserMozilla( dirName ); } } //------------------------------------------------------------------------------ function getFileBrowserMSIE( dirName ) { var result = ""; var inp = document.createElement("input"); inp.type="file"; inp.value=dirName; // Ne marche pas : pas trouvé de solution !!! inp.id = 'hiddenfile'; inp.name = 'fileSelect'; inp.style.visibility='hidden'; document.body.appendChild(inp); inp.click(); result = inp.value; document.body.removeChild(inp); inp = null; return result; } //------------------------------------------------------------------------------ function getFileBrowserMozilla( dirName ) { var result = ""; try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); } catch (e) { alert("Permission to access file was denied."); } var nsIFilePicker = Components.interfaces.nsIFilePicker; var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker); var dir = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); dirName = dirName.replace(/\//gi,mozex_dir_separator); dir.initWithPath( dirName ); fp.displayDirectory = dir; fp.init(window, "Sélectionnez un fichier", nsIFilePicker.modeOpen); // fp.appendFilter("Fichiers Images","*.jpg; *.jpeg"); fp.appendFilters(nsIFilePicker.filterImages); var res = fp.show(); if (res == nsIFilePicker.returnOK){ result = fp.file.path; } return result; } //------------------------------------------------------------------------------ function deleteFile( filename ) { if (MSIE4) { return deleteFileMSIE( filename ); } else { return deleteFileMozilla( filename ); } } function deleteFolder( filename ) { if (MSIE4) { return deleteFolderMSIE( filename ); } else { return deleteFolderMozilla( filename ); } } //------------------------------------------------------------------------------ function deleteFileMSIE( filename ) { var result = false; try { if (fso.FileExists(filename)) { fso.DeleteFile(filename); result = true; } } catch(e) { document.write("Exception in deleteFileMSIE"); } return result; } function deleteFolderMSIE( filename ) { var result = false; try { if (fso.FolderExists(filename)) { fso.DeleteFolder(filename); result = true; } } catch(e) { document.write("Exception in deleteFolderMSIE"); } return result; } function deleteFolderMozilla( filename ) { var result = false; try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); } catch (e) { alert("Permission to access file was denied."); } var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(); if (aFile instanceof Components.interfaces.nsILocalFile){ filename = filename.replace(/\//gi,mozex_dir_separator); aFile.initWithPath( filename ); if(!folderExists(filename)) return false; aFile.remove( true ); result = true; } return result; } //------------------------------------------------------------------------------ function deleteFileMozilla( filename ) { var result = false; try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); } catch (e) { alert("Permission to access file was denied."); } var aFile = Components.classes["@mozilla.org/file/local;1"].createInstance(); if (aFile instanceof Components.interfaces.nsILocalFile){ filename = filename.replace(/\//gi,mozex_dir_separator); aFile.initWithPath( filename ); if(!fileExists(filename)) return false; aFile.remove( false ); result = true; } return result; } //------------------------------------------------------------------------------ function getFiles( dirname ) { if (MSIE4) { return getFilesMSIE( dirname ); } else { return getFilesMozilla( dirname ); } } //------------------------------------------------------------------------------ function getFilesMSIE( dirname ) { var result = []; try { var idx=0 var parentFolder = fso.GetFolder(dirname); var enumFiles = new Enumerator(parentFolder.files); for (; !enumFiles.atEnd(); enumFiles.moveNext()) { var fileItem = enumFiles.item(); result.push( fileItem.name ); } return result; } catch (_err) { alert ("Failed to Populate File List:\n"); return null; } } //------------------------------------------------------------------------------ function getFilesMozilla( dirname ) { var result = []; try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); } catch (e) { alert("Permission to access file was denied."); } var dir = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); dirname = dirname.replace(/\//gi,mozex_dir_separator); dir.initWithPath( dirname ); alert(dirname); var entries = dir.directoryEntries; while(entries.hasMoreElements()) { var entry = entries.getNext(); entry.QueryInterface(Components.interfaces.nsIFile); result.push(entry.path); } return result; } //------------------------------------------------------------------------------ function fileExists( filename ) { if (MSIE4) { return fso.FileExists(filename); } else { return fileExistsMozilla( filename ); } } function folderExists( foldername ) { if (MSIE4) { return fso.FolderExists(foldername); } else { return folderExistsMozilla( foldername ); } } function folderExistsMozilla( foldername ) { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); } catch (e) { alert("Permission to save file was denied."); } var folder = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); foldername = foldername.replace(/\//gi,mozex_dir_separator); folder.initWithPath( foldername ); if(folder.exists()) return true; else return false; } //------------------------------------------------------------------------------ function fileExistsMozilla(filename) { var result = false; try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); } catch (e) { alert("Permission to read file was denied."); } var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); filename = filename.replace(/\//gi,mozex_dir_separator); file.initWithPath( filename ); result = file.exists(); return result; } function createFolder( directoryname ) { if (MSIE4) { fso.CreateFolder(directoryname); } else { createFolderMozilla( directoryname ); } } function createFolderMozilla(directoryname) { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); } catch (e) { alert("Permission to save file was denied."); } var directory = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); directoryname = directoryname.replace(/\//gi,mozex_dir_separator); directory.initWithPath( directoryname ); if( !directory.exists() || !directory.isDirectory() ) { // S'il n'existe pas, le créer directory.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0664); } } function relativeToAbsolute(path){ return getPath() +"/"+ path; } function absoluteToRelative(path,homeFolder){ var resultat = path.search(new RegExp("(.*)(/"+homeFolder+"/)(.*)","gi")); if(resultat != -1) return RegExp.$3; else return null; } function getFilePath(filePath) { var resultat = filePath.search(new RegExp(/(.*)\/((.*)\.(....?))/gi)); if(resultat != -1) return RegExp.$1; else return filePath; } function getFileString(filePath) { var resultat = filePath.search(new RegExp(/(.*)\/((.*)\.(....?))/gi)); if(resultat != -1) return RegExp.$2; else return filePath; } function getFileName(filePath) { var resultat = filePath.search(new RegExp(/(.*)\/((.*)\.(....?))/gi)); if(resultat != -1) return RegExp.$3; else return filePath; } function getFileExtension(filePath) { var resultat = filePath.search(new RegExp(/(.*)\/((.*)\.(....?))/gi)); if(resultat != -1) return RegExp.$4; else return null; } function copyFolder(folderSrc,folderDest,overwrite){ if (MSIE4) { fso.CopyFolder(folderSrc,folderDest,overwrite); } else { copyFolderMozilla( folderSrc,folderDest,overwrite ); } } function getParentFolder(path) { var resultat = path.search(new RegExp(/(.*)\/([^\/]*)/gi)); if(resultat != -1) return RegExp.$1; else return path; } function getFolderName(path) { var resultat = path.search(new RegExp(/(.*)\/([^\/]*)/gi)); if(resultat != -1) return RegExp.$2; else return path; } var nn = !!document.layers; var ie = !!document.all; /** reagarde si XPCOM est supporté*/ var mozilla = !!window.Components; var pageChargee = false; window.onload = function() { window.clipboard = new Clipboard(); pageChargee = true; } /** Focntion qui permet d'attendre que la page se charge*/ function waitForLoad(_function) { if (pageChargee){ _function } else { setTimeout('waitForLoad()', 100); } } /** Créer une nouvelle instance de Clipboard compatible Netscape, IE et Mozilla *
  • @class Permet de lire et d'écrire du texte dans le presse papier du système
  • @return {Clipboard} Retourne un objet de type Clipboard
  • @type {Object}
  • @constructor
  • /
function Clipboard() { if ( nn ) { netscape.security.PrivilegeManager.enablePrivilege( 'UniversalSystemClipboardAccess' ); var tmp = new java.awt.Frame(); this.clipboard = fr.getToolkit().getSystemClipboard(); } else if ( ie ) { this.clipboard = document.createElement( 'INPUT' ); with ( this.clipboard.style ) { position = 'absolute'; left = '0px'; top = '0px'; visibility = 'hidden'; } document.body.appendChild( this.clipboard ); } else if ( mozilla ) { netscape.security.PrivilegeManager.enablePrivilege( 'UniversalXPConnect' ); this.clipboardid = Components.interfaces.nsIClipboard; this.clipboard = Components.classes['@mozilla.org/widget/clipboard;1'].getService( this.clipboardid ); this.clipboardstring = Components.classes['@mozilla.org/supports-string;1'].createInstance( Components.interfaces.nsISupportsString ); } this.copy = Clipboard_copy; this.paste = Clipboard_paste; } /** Copie une chaine de caractère dans le presse papier. Des priviliges sont recquis
  • @param {string} text Texte à copier
  • /
function Clipboard_copy( text ) { if ( nn ) { field.select(); this.clipboard.setContents( new java.awt.datatransfer.StringSelection( text ), null ); } else if ( ie ) { this.clipboard.value = text; this.clipboard.select(); var textRange = this.clipboard.createTextRange(); textRange.execCommand( 'copy' ); } else if ( mozilla ) { netscape.security.PrivilegeManager.enablePrivilege( 'UniversalXPConnect' ); this.clipboardstring.data = text; var transfer = Components.classes['@mozilla.org/widget/transferable;1'].createInstance( Components.interfaces.nsITransferable ); transfer.setTransferData( 'text/unicode', this.clipboardstring, text.length*2 ); this.clipboard.setData( transfer, null, this.clipboardid.kGlobalClipboard ); } } /** Renvoie le texte contenus dans le presse papier
  • @return {String} Attention, seul le texte pur sera renvoyé
  • /
function Clipboard_paste() { if ( nn ) { var content = this.clipboard.getContents( null ); if ( content != null ) { return content.getTransferData( java.awt.datatransfer.DataFlavor.stringFlavor ); } } else if ( ie ) { this.clipboard.value = ''; var textRange = this.clipboard.createTextRange(); textRange.execCommand( 'paste' ); return this.clipboard.value; } else if ( mozilla ) { netscape.security.PrivilegeManager.enablePrivilege( 'UniversalXPConnect' ); var transfer = Components.classes['@mozilla.org/widget/transferable;1'].createInstance( Components.interfaces.nsITransferable ); transfer.addDataFlavor( 'text/unicode' ); this.clipboard.getData( transfer, this.clipboardid.kGlobalClipboard ); var str = new Object(); var strLength = new Object(); transfer.getTransferData( 'text/unicode', str, strLength ); str = str.value.QueryInterface( Components.interfaces.nsISupportsString ); return str.data.substring( 0, strLength.value / 2 ); } } function findPos(obj) { var curleft = curtop = 0; if (obj.offsetParent) { do { curleft += obj.offsetLeft; curtop += obj.offsetTop; } while (obj = obj.offsetParent); return [curleft,curtop]; } }

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
20
Date d'inscription
jeudi 30 novembre 2000
Statut
Membre
Dernière intervention
21 mars 2010

déjà super pour cette source :)

Quelqu'un aurez trouvé pour enregistrer un fichier avec les problème de droits ?
Amicalement :)
Messages postés
1
Date d'inscription
jeudi 7 octobre 2004
Statut
Membre
Dernière intervention
29 mars 2009

Bon code, très utile.
Par contre il faut modifier la fonction getFilesMozilla()
Il faut utiliser : result.push(entry.leafName);
Au lieu de : result.push(entry.path);
Sinon quand on appel getFiles() on n'a pas le même type de retour sous IE que sous FF.
Avec cette modification on recevera toujours une liste de fichiers et non pas un liste de chemins sous FF.
Messages postés
2
Date d'inscription
mercredi 6 février 2008
Statut
Membre
Dernière intervention
13 octobre 2008

Bonjour à tous,
moi mon gros problème, c'est qu'une bonne partie des fonctions n'a pas de commentaires en en-têtes, ce qui n'aide pas à la compréhension...
Ce que je cherche à faire, c'est une page ou le client peut uploader une image sur le serveur depuis un input file, et ce que j'aimerais c'est que quand il à fini de choisir l'image à uploader (parcourir, valider), celle-ci s'affiche en dessous du input file. Je sais que c'est actuellement possible avec IE mais pas avec FF à cause qu'il récupère file:///exemple.jpg et à ce que j'ai pu comprendre du script qu'on à ici c'est qu'il arrangeait ce problème avec FF grâce à XPCOM... Mais un exemple concret de l'utilisation de ces fonctions (avec un input file par exemple) serait le bienvenue :D
Messages postés
10
Date d'inscription
dimanche 23 octobre 2005
Statut
Membre
Dernière intervention
8 novembre 2008

Bonjour,

je n'arrive pas a accéder a l'exemple et je dois avouer que sans exemple je suis un peu perdu sur se script, je métrise pas JS a se point ^^.

sa serait possible de poster un exemple directement en commentaire pour que je puisse l'adapter??

Merci
PazZ
Messages postés
3472
Date d'inscription
lundi 16 juillet 2007
Statut
Membre
Dernière intervention
28 février 2014
30
j'ai pas bien compris ce que veus dire ton blablabla !

a++
Afficher les 26 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.