J'essaie d'écrire un lecteur de fichier texte simple en créant une fonction qui prend le chemin du fichier et convertit chaque ligne de texte en tableau de caractères, mais cela ne fonctionne pas.
function readTextFile() {
var rawFile = new XMLHttpRequest();
rawFile.open("GET", "testing.txt", true);
rawFile.onreadystatechange = function() {
if (rawFile.readyState === 4) {
var allText = rawFile.responseText;
document.getElementById("textSection").innerHTML = allText;
}
}
rawFile.send();
}
Qu'est-ce qui ne va pas ici?
Cela ne semble toujours pas fonctionner après avoir légèrement modifié le code d’une révision précédente et maintenant, il m’a donné une exception XMLHttpRequest
.
J'ai testé cela sur Firefox et cela fonctionne, mais dans Google Chrome, cela ne fonctionne tout simplement pas et cela me donne toujours une exception 101. Comment puis-je obtenir que cela fonctionne non seulement sur Firefox, mais aussi sur d'autres navigateurs (notamment Chrome )?
Vous devez vérifier le statut 0 (comme lors du chargement de fichiers localement avec XMLHttpRequest
, aucun statut n'est renvoyé car il ne provient pas d'un Webserver
)
function readTextFile(file)
{
var rawFile = new XMLHttpRequest();
rawFile.open("GET", file, false);
rawFile.onreadystatechange = function ()
{
if(rawFile.readyState === 4)
{
if(rawFile.status === 200 || rawFile.status == 0)
{
var allText = rawFile.responseText;
alert(allText);
}
}
}
rawFile.send(null);
}
Et spécifiez file://
dans votre nom de fichier:
readTextFile("file:///C:/your/path/to/file.txt");
Visitez Javascripture ! Et allez la section readAsText et essayez l'exemple. Vous pourrez savoir comment le readAsText fonction de FileReader travaux.
<html>
<head>
<script>
var openFile = function(event) {
var input = event.target;
var reader = new FileReader();
reader.onload = function(){
var text = reader.result;
var node = document.getElementById('output');
node.innerText = text;
console.log(reader.result.substring(0, 200));
};
reader.readAsText(input.files[0]);
};
</script>
</head>
<body>
<input type='file' accept='text/plain' onchange='openFile(event)'><br>
<div id='output'>
...
</div>
</body>
</html>
Après l’introduction de fetch api en javascript, la lecture du contenu d’un fichier ne pourrait être plus simple.
lecture d'un fichier texte
fetch('file.txt')
.then(response => response.text())
.then(text => console.log(text))
// outputs the content of the text file
lecture d'un fichier json
fetch('file.json')
.then(response => response.json())
.then(jsonResponse => console.log(jsonResponse))
// outputs a javascript object from the parsed json
Cette technique fonctionne bien dans Firefox, mais il semble que l'implémentation
fetch
de Chrome ne prend pas en charge le schéma d'URLfile:///
à la date de rédaction de cette mise à jour (testé dans Chrome 68).
var input = document.getElementById("myFile");
var output = document.getElementById("output");
input.addEventListener("change", function () {
if (this.files && this.files[0]) {
var myFile = this.files[0];
var reader = new FileReader();
reader.addEventListener('load', function (e) {
output.textContent = e.target.result;
});
reader.readAsBinaryString(myFile);
}
});
<input type="file" id="myFile">
<hr>
<textarea style="width:500px;height: 400px" id="output"></textarea>
Jon Perryman,
Oui, js peut lire les fichiers locaux (voir FileReader ()), mais pas automatiquement: l'utilisateur doit transmettre le fichier ou une liste de fichiers au script avec un code HTML <input type=file>
.
Ensuite, avec js, il est possible de traiter (vue exemple) le fichier ou la liste de fichiers, certaines de leurs propriétés et le contenu du fichier.
Ce que js ne peut pas faire pour des raisons de sécurité est d’accéder automatiquement (sans la saisie de l’utilisateur) au système de fichiers de son ordinateur.
Pour permettre à js d’accéder automatiquement à la fs locale, il est nécessaire de créer non pas un fichier HTML contenant js, mais un document hta.
Un fichier hta peut contenir du contenu js ou vbs.
Mais l'exécutable hta ne fonctionnera que sur les systèmes Windows.
C'est le comportement standard du navigateur.
Aussi, Google Chrome a fonctionné à la fs api, plus d'infos ici: http://www.html5rocks.com/fr/tutorials/file/filesystem/
Peut-être que vous l'avez déjà essayé, tapez "false" comme suit:
rawFile.open("GET", file, false);
Essayez de créer deux fonctions:
function getData(){ //this will read file and send information to other function
var xmlhttp;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
}
else {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4) {
var lines = xmlhttp.responseText; //*here we get all lines from text file*
intoArray(lines); *//here we call function with parameter "lines*"
}
}
xmlhttp.open("GET", "motsim1.txt", true);
xmlhttp.send();
}
function intoArray (lines) {
// splitting all text data into array "\n" is splitting data from each new line
//and saving each new line as each element*
var lineArr = lines.split('\n');
//just to check if it works output lineArr[index] as below
document.write(lineArr[2]);
document.write(lineArr[3]);
}
autre exemple - mon lecteur avec la classe FileReader
<html>
<head>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.11.3/themes/smoothness/jquery-ui.css">
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script src="http://code.jquery.com/ui/1.11.3/jquery-ui.js"></script>
</head>
<body>
<script>
function PreviewText() {
var oFReader = new FileReader();
oFReader.readAsDataURL(document.getElementById("uploadText").files[0]);
oFReader.onload = function (oFREvent) {
document.getElementById("uploadTextValue").value = oFREvent.target.result;
document.getElementById("obj").data = oFREvent.target.result;
};
};
jQuery(document).ready(function(){
$('#viewSource').click(function ()
{
var text = $('#uploadTextValue').val();
alert(text);
//here ajax
});
});
</script>
<object width="100%" height="400" data="" id="obj"></object>
<div>
<input type="hidden" id="uploadTextValue" name="uploadTextValue" value="" />
<input id="uploadText" style="width:120px" type="file" size="10" onchange="PreviewText();" />
</div>
<a href="#" id="viewSource">Source file</a>
</body>
</html>
Cela pourrait aider,
var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
alert(xmlhttp.responseText);
}
}
xmlhttp.open("GET", "sample.txt", true);
xmlhttp.send();
function readTextFile(file) {
var rawFile = new XMLHttpRequest(); // XMLHttpRequest (often abbreviated as XHR) is a browser object accessible in JavaScript that provides data in XML, JSON, but also HTML format, or even a simple text using HTTP requests.
rawFile.open("GET", file, false); // open with method GET the file with the link file , false (synchronous)
rawFile.onreadystatechange = function ()
{
if(rawFile.readyState === 4) // readyState = 4: request finished and response is ready
{
if(rawFile.status === 200) // status 200: "OK"
{
var allText = rawFile.responseText; // Returns the response data as a string
console.log(allText); // display text on the console
}
}
}
rawFile.send(null); //Sends the request to the server Used for GET requests with param null
}
readTextFile("text.txt"); //<= Call function ===== don't need "file:///..." just the path
- lire le texte du fichier depuis javascript
- Texte du journal de la console à partir d'un fichier en utilisant javascript
- Google chrome et mozilla firefox
dans mon cas j'ai cette structure de fichiers:
Utilisation de Fetch et de la fonction asynchrone
const logFileText = async file => {
const response = await fetch(file)
const text = await response.text()
console.log(text)
}
logFileText('file.txt')
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$.ajax({`enter code here`
url: "TextFile.txt",
dataType: "text",
success: function (data) {
var text = $('#newCheckText').val();
var str = data;
var str_array = str.split('\n');
for (var i = 0; i < str_array.length; i++) {
// Trim the excess whitespace.
str_array[i] = str_array[i].replace(/^\s*/, "").replace(/\s*$/, "");
// Add additional code here, such as:
alert(str_array[i]);
$('#checkboxes').append('<input type="checkbox" class="checkBoxClass" /> ' + str_array[i] + '<br />');
}
}
});
$("#ckbCheckAll").click(function () {
$(".checkBoxClass").prop('checked', $(this).prop('checked'));
});
});
</script>
</head>
<body>
<div id="checkboxes">
<input type="checkbox" id="ckbCheckAll" class="checkBoxClass"/> Select All<br />
</div>
</body>
</html>
Si vous consultez les journaux de la console, vous constaterez que "les demandes d'origine croisée ne sont pas prises en charge pour les schémas de protocole: http, données, chrome, extension de chrome, https".
Cela signifie essentiellement que chrome crée une sorte de disque virtuel pour chaque domaine. Tous les fichiers desservis par le domaine via les protocoles énumérés ci-dessus y sont stockés. L'accès aux fichiers situés en dehors de celui-ci sur votre disque local est restreint par la même stratégie Origin pour des raisons de sécurité. Les requêtes et les réponses AJAX se produisent essentiellement sur http/https, donc ne fonctionneront pas pour les fichiers locaux.
Firefox ne met pas une telle restriction, donc votre code fonctionnera avec bonheur sur Firefox. Cependant, il existe également des solutions de contournement pour Chrome: voir ici .
En ajoutant à certaines des réponses ci-dessus, cette solution modifiée a fonctionné pour moi.
<input id="file-upload-input" type="file" class="form-control" accept="*" />
....
let fileInput = document.getElementById('file-upload-input');
let files = fileInput.files;
//Use createObjectURL, this should address any CORS issues.
let filePath = URL.createObjectURL(files[0]);
....
function readTextFile(filePath){
var rawFile = new XMLHttpRequest();
rawFile.open("GET", filePath , true);
rawFile.send(null);
rawFile.onreadystatechange = function (){
if(rawFile.readyState === 4){
if(rawFile.status === 200 || rawFile.status == 0){
var allText = rawFile.responseText;
console.log(allText);
}
}
}
}
Vous pouvez importer ma bibliothèque:
<script src="https://www.editeyusercontent.com/preview/1c_hhRGD3bhwOtWwfBD8QofW9rD3T1kbe/[email protected]"></script>
ensuite, la fonction fetchfile(path)
renverra le fichier téléchargé
<script src="https://www.editeyusercontent.com/preview/1c_hhRGD3bhwOtWwfBD8QofW9rD3T1kbe/code.js"></script>
<script>console.log(fetchfile("file.txt"))</script>
Remarque: sur Google Chrome, si le code HTML est local, des erreurs apparaîtront, mais l'enregistrement du code HTML et des fichiers en ligne, puis l'exécution du fichier HTML en ligne fonctionnent.
Récupère les données du fichier local en charge js (data.js):
function loadMyFile(){
console.log("ut:"+unixTimeSec());
loadScript("data.js?"+unixTimeSec(), loadParse);
}
function loadParse(){
var mA_=mSdata.split("\n");
console.log(mA_.length);
}
function loadScript(url, callback){
var script = document.createElement("script")
script.type = "text/javascript";
if (script.readyState){ //IE
script.onreadystatechange = function(){
if (script.readyState == "loaded" ||
script.readyState == "complete"){
script.onreadystatechange = null;
callback();
}
};
} else { //Others
script.onload = function(){
callback();
};
}
script.src = url;
document.getElementsByTagName("head")[0].appendChild(script);
}
function hereDoc(f) {
return f.toString().
replace(/^[^\/]+\/\*![^\r\n]*[\r\n]*/, "").
replace(/[\r\n][^\r\n]*\*\/[^\/]+$/, "");
}
function unixTimeSec(){
return Math.round( (new Date()).getTime()/1000);
}
fichier de data.js comme:
var mSdata = hereDoc(function() {/*!
17,399
1237,399
BLAHBLAH
BLAHBLAH
155,82
194,376
*/});
dynamic unixTime queryString empêche la mise en cache.
AJ fonctionne en Web http: //.
Pour lire le texte d'un fichier local via JavaScript
à l'aide de chrome, le navigateur Chrome doit s'exécuter avec l'argument --allow-file-access-from-files
pour permettre à JavaScript d'accéder au fichier local. Vous pouvez alors le lire à l'aide de XmlHttpRequest
comme suit:
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4) {
var allText = xmlhttp.responseText;
}
};
xmlhttp.open("GET", file, false);
xmlhttp.send(null);