web-dev-qa-db-fra.com

Enregistrement de texte dans un fichier local dans Internet Explorer 10

Je dois pouvoir enregistrer une chaîne dans un fichier local. Basé sur le code dans ici je suis le suivant:

function saveTextAsFile(fileNameToSaveAs, textToWrite) {
var textFileAsBlob = new Blob([textToWrite], {
    type: 'text/plain'
});

var downloadLink = document.createElement("a");
downloadLink.download = fileNameToSaveAs;
downloadLink.innerHTML = "Download File";

if (true) { //window.webkitURL !== null) {
    // Chrome allows the link to be clicked
    // without actually adding it to the DOM.
    downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
} else {
    // Firefox requires the link to be added to the DOM
    // before it can be clicked.
    downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
    downloadLink.onclick = destroyClickedElement;
    downloadLink.style.display = "none";
    document.body.appendChild(downloadLink);
}

downloadLink.click();
}

Cela fonctionne bien pour Chrome et Firefox, mais pas pour Internet Explorer 10 en tant que

downloadLink.click();

donne:

SCRIPT5: Access is denied.

Y at-il une explication/solution à cela?

merci!

21
kofifus

Thx to mstubna, voici une solution pour Chrome, FF et IE> 9:

function saveTextAsFile(fileNameToSaveAs, textToWrite) {
  /* Saves a text string as a blob file*/  
  var ie = navigator.userAgent.match(/MSIE\s([\d.]+)/),
      ie11 = navigator.userAgent.match(/Trident\/7.0/) && navigator.userAgent.match(/rv:11/),
      ieEDGE = navigator.userAgent.match(/Edge/g),
      ieVer=(ie ? ie[1] : (ie11 ? 11 : (ieEDGE ? 12 : -1)));

  if (ie && ieVer<10) {
    console.log("No blobs on IE ver<10");
    return;
  }

  var textFileAsBlob = new Blob([textToWrite], {
    type: 'text/plain'
  });

  if (ieVer>-1) {
    window.navigator.msSaveBlob(textFileAsBlob, fileNameToSaveAs);

  } else {
    var downloadLink = document.createElement("a");
    downloadLink.download = fileNameToSaveAs;
    downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
    downloadLink.onclick = function(e) { document.body.removeChild(e.target); };
    downloadLink.style.display = "none";
    document.body.appendChild(downloadLink);
    downloadLink.click();
  }
}
29
kofifus

IE 10 et 11 utilisent une syntaxe distincte pour télécharger ou enregistrer des blobs sur la machine cliente. Une fois que vous avez créé un blob, utilisez:

window.navigator.msSaveBlob(blob, 'file.txt'); 

ou 

window.navigator.msSaveOrOpenBlob(blob, 'file.txt');

pour déclencher la sauvegarde de fichier ou la boîte de dialogue de sauvegarde/ouverture de fichier.

Pour plus d'informations, voir http://msdn.Microsoft.com/en-us/library/ie/hh673542(v=vs.85).aspx

30
mstubna

Pour les navigateurs modernes, la solution va comme ceci, testée: IE11, FF & Chrome

var csvData = new Blob([arg.data], {type: 'text/csv;charset=utf-8;'});
//IE11 & Edge
if (navigator.msSaveBlob) {
	navigator.msSaveBlob(csvData, exportFilename);
} else {
	//In FF link must be added to DOM to be clicked
	var link = document.createElement('a');
	link.href = window.URL.createObjectURL(csvData);
	link.setAttribute('download', exportFilename);
	document.body.appendChild(link);	
	link.click();
	document.body.removeChild(link);	
}

7
keemor

plus pour ie Edge:

var ieEDGE = navigator.userAgent.match(/Edge/g);
if (ie || ie11 || ieEDGE) {
    if (ieVer>9 || ieEDGE) {
        var textFileAsBlob = new Blob([textToWrite], {
            type: 'text/plain'
        });
        window.navigator.msSaveBlob(textFileAsBlob, fileName);
    } else {
        console.log("No supported on IE ver<10");
    }
} else { ... }
3
I. Alexandr

Vous pouvez utiliser FileSaver library pour y parvenir. Facile à utiliser, prend en charge les types et versions de navigateur . Il existe également une version AngularJS .

0
kali