Je veux écrire des données dans un fichier existant en utilisant JavaScript. Je ne veux pas l'imprimer sur la console. Je veux réellement écrire des données sur abc.txt
. J'ai lu beaucoup de questions à réponses, mais partout où ils impriment sur console. à un endroit donné, ils ont donné du code mais cela ne fonctionne pas. Alors, s'il vous plaît, quelqu'un peut-il m'aider à écrire des données dans File?.
J'ai référé le code mais ça ne marche pas: ça donne une erreur:
Uncaught TypeError: Illegal constructor
sur chrome et
SecurityError: The operation is insecure.
sur Mozilla
var f = "sometextfile.txt";
writeTextFile(f, "Spoon")
writeTextFile(f, "Cheese monkey")
writeTextFile(f, "Onion")
function writeTextFile(afilename, output)
{
var txtFile =new File(afilename);
txtFile.writeln(output);
txtFile.close();
}
Donc, pouvons-nous réellement écrire des données dans un fichier en utilisant seulement Javascript ou PAS? S'il vous plaît, aidez-moi Merci d'avance
Quelques suggestions pour cela -
Vous pouvez créer des fichiers dans le navigateur en utilisant Blob
et URL.createObjectURL
. Tous les navigateurs récents support this .
Vous ne pouvez pas enregistrer directement le fichier que vous créez, car cela poserait de gros problèmes de sécurité, mais vous pouvez le fournir en tant que lien de téléchargement pour l'utilisateur. Vous pouvez suggérer un nom de fichier via le attribut download
du lien, dans les navigateurs prenant en charge l’attribut download. Comme pour tout autre téléchargement, l'utilisateur téléchargeant le fichier aura le dernier mot sur le nom du fichier.
_var textFile = null,
makeTextFile = function (text) {
var data = new Blob([text], {type: 'text/plain'});
// If we are replacing a previously generated file we need to
// manually revoke the object URL to avoid memory leaks.
if (textFile !== null) {
window.URL.revokeObjectURL(textFile);
}
textFile = window.URL.createObjectURL(data);
// returns a URL you can use as a href
return textFile;
};
_
Voici un exemple qui utilise cette technique pour enregistrer du texte arbitraire à partir de textarea
.
Si vous souhaitez lancer immédiatement le téléchargement au lieu de demander à l'utilisateur de cliquer sur un lien, vous pouvez utiliser des événements de souris pour simuler un clic de souris sur le lien en tant que Lifecube 's answer = fait. J'ai créé un exemple mis à jour qui utilise cette technique.
_ var create = document.getElementById('create'),
textbox = document.getElementById('textbox');
create.addEventListener('click', function () {
var link = document.createElement('a');
link.setAttribute('download', 'info.txt');
link.href = makeTextFile(textbox.value);
document.body.appendChild(link);
// wait for the link to be added to the document
window.requestAnimationFrame(function () {
var event = new MouseEvent('click');
link.dispatchEvent(event);
document.body.removeChild(link);
});
}, false);
_
Si vous parlez du javascript du navigateur, vous ne pouvez pas écrire de données directement dans un fichier local pour des raisons de sécurité. La nouvelle API HTML 5 ne peut vous permettre que de lire des fichiers.
Mais si vous voulez écrire des données, et permettre à l'utilisateur de télécharger en tant que fichier au niveau local. le code suivant fonctionne:
function download(strData, strFileName, strMimeType) {
var D = document,
A = arguments,
a = D.createElement("a"),
d = A[0],
n = A[1],
t = A[2] || "text/plain";
//build download link:
a.href = "data:" + strMimeType + "charset=utf-8," + escape(strData);
if (window.MSBlobBuilder) { // IE10
var bb = new MSBlobBuilder();
bb.append(strData);
return navigator.msSaveBlob(bb, strFileName);
} /* end if(window.MSBlobBuilder) */
if ('download' in a) { //FF20, CH19
a.setAttribute("download", n);
a.innerHTML = "downloading...";
D.body.appendChild(a);
setTimeout(function() {
var e = D.createEvent("MouseEvents");
e.initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
a.dispatchEvent(e);
D.body.removeChild(a);
}, 66);
return true;
}; /* end if('download' in a) */
//do iframe dataURL download: (older W3)
var f = D.createElement("iframe");
D.body.appendChild(f);
f.src = "data:" + (A[2] ? A[2] : "application/octet-stream") + (window.btoa ? ";base64" : "") + "," + (window.btoa ? window.btoa : escape)(strData);
setTimeout(function() {
D.body.removeChild(f);
}, 333);
return true;
}
pour l'utiliser:
download('the content of the file', 'filename.txt', 'text/plain');
La réponse ci-dessus est utile mais, j'ai trouvé le code qui vous permet de télécharger le fichier texte directement sur un clic de bouton. Dans ce code, vous pouvez également changer filename
comme vous le souhaitez. C'est une fonction javascript pure avec HTML5. Travaille pour moi!
function saveTextAsFile()
{
var textToWrite = document.getElementById("inputTextToSave").value;
var textFileAsBlob = new Blob([textToWrite], {type:'text/plain'});
var fileNameToSaveAs = document.getElementById("inputFileNameToSaveAs").value;
var downloadLink = document.createElement("a");
downloadLink.download = fileNameToSaveAs;
downloadLink.innerHTML = "Download File";
if (window.webkitURL != null)
{
// Chrome allows the link to be clicked
// without actually adding it to the DOM.
downloadLink.href = window.webkitURL.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();
}
Dans le cas où il n'est pas possible d'utiliser la nouvelle solution Blob
, qui est certainement la meilleure solution pour les navigateurs modernes, il est toujours possible d'utiliser cette approche plus simple, qui limite d'ailleurs la taille du fichier. :
function download() {
var fileContents=JSON.stringify(jsonObject, null, 2);
var fileName= "data.json";
var pp = document.createElement('a');
pp.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(fileContents));
pp.setAttribute('download', fileName);
pp.click();
}
setTimeout(function() {download()}, 500);
$('#download').on("click", function() {
function download() {
var jsonObject = {
"name": "John",
"age": 31,
"city": "New York"
};
var fileContents = JSON.stringify(jsonObject, null, 2);
var fileName = "data.json";
var pp = document.createElement('a');
pp.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(fileContents));
pp.setAttribute('download', fileName);
pp.click();
}
setTimeout(function() {
download()
}, 500);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="download">Download me</button>
Essayer
let a = document.createElement('a');
a.href = "data:application/octet-stream,"+encodeURIComponent("My DATA");
a.download = 'abc.txt';
a.click();
Utilisez le code de l'utilisateur @ useless-code ci-dessus ( https://stackoverflow.com/a/21016088/327386 ) pour générer le fichier. Si vous souhaitez télécharger le fichier automatiquement, transmettez à cette fonction le textFile
qui vient d'être généré:
var downloadFile = function downloadURL(url) {
var hiddenIFrameID = 'hiddenDownloader',
iframe = document.getElementById(hiddenIFrameID);
if (iframe === null) {
iframe = document.createElement('iframe');
iframe.id = hiddenIFrameID;
iframe.style.display = 'none';
document.body.appendChild(iframe);
}
iframe.src = url;
}
J'ai trouvé de bonnes réponses ici, mais j'ai aussi trouvé un moyen plus simple.
Le bouton permettant de créer le blob et le lien de téléchargement peuvent être combinés en un seul lien, l’élément de lien pouvant avoir un attribut onclick. (L'inverse ne semble pas possible, l'ajout d'un href à un bouton ne fonctionne pas.)
Vous pouvez attribuer un style au lien en tant que bouton en utilisant bootstrap
, qui reste du javascript pur, à l'exception du style.
La combinaison du bouton et du lien de téléchargement réduit également le code, car moins d'appels laids getElementById
sont nécessaires.
Cet exemple nécessite un seul clic sur le bouton pour créer le blob de texte et le télécharger:
<a id="a_btn_writetofile" download="info.txt" href="#" class="btn btn-primary"
onclick="exportFile('This is some dummy data.\nAnd some more dummy data.\n', 'a_btn_writetofile')"
>
Write To File
</a>
<script>
// URL pointing to the Blob with the file contents
var objUrl = null;
// create the blob with file content, and attach the URL to the downloadlink;
// NB: link must have the download attribute
// this method can go to your library
function exportFile(fileContent, downloadLinkId) {
// revoke the old object URL to avoid memory leaks.
if (objUrl !== null) {
window.URL.revokeObjectURL(objUrl);
}
// create the object that contains the file data and that can be referred to with a URL
var data = new Blob([fileContent], { type: 'text/plain' });
objUrl = window.URL.createObjectURL(data);
// attach the object to the download link (styled as button)
var downloadLinkButton = document.getElementById(downloadLinkId);
downloadLinkButton.href = objUrl;
};
</script>