Як прочитати локальний текстовий файл?


371

Я намагаюся написати простий читач текстових файлів, створивши функцію, яка бере шлях до файлу і перетворює кожен рядок тексту в масив char, але це не працює.

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();
}

Що тут не так?

Це все ще не працює, після зміни коду трохи від попередньої редакції, і тепер це дає мені XMLHttpRequestвиняток 101.

Я перевірив це на Firefox, і він працює, але в Google Chrome він просто не працюватиме, і він надає мені виняток 101. Як змусити це працювати не лише на Firefox, але і на інших браузерах (особливо Chrome )?


Що конкретно відбувається. Немає нічого в масиві? Або просто "неправильні" речі ..?
PinkElephantsOnParade

Ви тестуєте на локальній машині? Переконайтеся , що тест на statusз 0, а також 200.
Jeffrey Sweeney

1
@JeffreySweeney так, я тестую це на локальній машині. Я зберігав текстовий файл там же, де і javascripts та html
Danny

Відповіді:


311

Вам потрібно перевірити стан 0 (як при завантаженні файлів локально XMLHttpRequest, статус не повертається, оскільки він не з a 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);
}

І вкажіть file://у своєму файлі:

readTextFile("file:///C:/your/path/to/file.txt");

2
Я фактично працюю над цим на mac, тож би я все-таки вказував файл: // ??
Денні

11
спробуйте помістити file:///User/Danny/Desktop/javascriptWork/testing.txtв URL-адресу свого веб-переглядача і побачити, чи можете ви бачити файл ..
Majid Laissi

21
це не повинно бути абсолютним шляхом. це працювало для мене просто чудово: readTextFile ('Властивості / версія.txt'); Дякую!
Sonic Soul

2
Оскільки ми читаємо з веб-сервера, нам слід встановити асинхронізацію true. Якщо це був простий localпошук, то встановлення асинхронізації в falseпорядку, але onreadystatechangeвоно не потрібне, коли воно встановлено на значення false. Ось документація: w3schools.com/ajax/ajax_xmlhttprequest_send.asp
rambossa

149
Це не буде працювати в Chrome (можливо, інші веб-переглядачі), ви отримаєте "Перехресні запити походження підтримуються лише для протокольних схем: http, data, chrome, chrome-extension, https, chrome-extension-resource."
Рік Берджесс

102

Відвідайте Javascripture ! І перейдіть до розділу readAsText і спробуйте приклад. Ви зможете дізнатися, як працює функція readAsText FileReader .

    <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>

14
Посилання є приємними, але ви завжди повинні "цитувати найрелевантнішу частину важливого посилання, на випадок, якщо цільовий сайт недоступний або виходить постійно в офлайн". Див. Як написати гарну відповідь .
4ae1e1

16
У цьому прикладі йдеться про введений користувачем текстовий файл, але я думаю, що питання стосувалося локального для сервера файлу.
С. Кірбі

@ S.Kirby Як сказала ОП у відповідь на запитання про те, чи працює він локально або на віддаленому сервері: це все локально. все в одній папці більше нічого. . Крім того, у інших людей (як я) може виникнути питання про те, як це зробити на місцевому рівні.
Саймон Форсберг

102

Після введення вибору api в JavaScript, читання вмісту файлів не може бути простішим.

читання текстового файлу

fetch('file.txt')
  .then(response => response.text())
  .then(text => console.log(text))
  // outputs the content of the text file

читання файлу json

fetch('file.json')
  .then(response => response.json())
  .then(jsonResponse => console.log(jsonResponse))     
   // outputs a javascript object from the parsed json

Оновлення 30.07.2018 (відмова від відповідальності):

Цей метод відмінно працює в Firefox , але схоже , Chrome «s fetchреалізація не підтримує file:///схему URL на момент написання цього оновлення (перевірено в Chrome 68).

Update-2 (відмова від відповідальності):

Ця методика не працює з Firefox версії 68 (9 липня 2019 року) з тієї ж причини (безпеки), що і Chrome : CORS request not HTTP. Дивіться https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSRequestNotHttp .


4
Блискуче! Цитуючи стандарт Fetch: "забезпечує послідовне поводження з: URL-схемами, переадресаціями, семантикою між походженнями, CSP, службовцями, змішаним вмістом Referer". Я думаю, це означає прощання з добрими ol'FileReaders та HttpRequests (і я їх трохи не пропущу;)
Armfoot

1
Але як можна використовувати текст і помістити його в змінну рядка для використання в інших місцях? (Я продовжую отримувати "невизначений", незалежно від того, що я їм роблю.)
not2qubit

2
@ not2qubit - отримання текстового файлу - це операція асинхронізації. Ви не визначаєтесь, оскільки використовуєте змінну до повного зчитування файлу. Ви повинні використовувати його всередині зворотного виклику обіцянок або використовувати щось на зразок операторів javascript "async wait".
Абделазіз Мохначе

13
Fetch API cannot load file:///C:/Users/path/to/file/file.txt. URL scheme must be "http" or "https" for CORS request.
Яків Шнайдер

1
сумісність веб-переглядача: developer.mozilla.org/en-US/docs/Web/API/…
Сем Мерфі

39

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>


9
Я не впевнений, що це відповідає на це 4-річне запитання. ОП не завантажує документи, вони намагаються прочитати текстовий файл в одному каталозі з контуру. І якщо ви збираєтесь відповідати на запитання цієї старої, принаймні напишіть короткий підсумок того, чому ви вважаєте, що ваша відповідь зараз краща за інші або як змінилася мова з моменту запитання, щоб отримати нову відповідь.
Метью Ціарамітаро

1
За допомогою власного наявного файлу html для завантаження вхідного файлу - копіювання рядків var reader = new FileReader();наскрізь reader.readAsBinaryString(..)- він читає вміст мого текстового файлу. Чистий, елегантний, працює як шарм. Найкраща відповідь у цій темі для мене - дякую!
Джин Бо

18

Джон Перріман,

Так, js може читати локальні файли (див. FileReader ()), але не автоматично: користувач повинен передати файл або список файлів у скрипт із html <input type=file>.

Тоді за допомогою js можна обробити (приклад перегляду) файлу чи списку файлів, деяких їх властивостей та вмісту файлу чи файлів.

Що js не може зробити з міркувань безпеки, це автоматичний доступ (без введення користувача) до файлової системи його комп'ютера.

Щоб дозволити js автоматично отримувати доступ до локальних файлів, потрібно створити не html-файл із js всередині нього, а hta-документ.

Хта-файл може містити js або vbs всередині нього.

Але виконуваний файл hta буде працювати тільки в системах Windows.

Це стандартна поведінка браузера.

Також Google Chrome працював у програмі fs api, більше інформації тут: http://www.html5rocks.com/en/tutorials/file/filesystem/


це коментар, що я шукав. Усі ставлять код для введення користувачем файлу як вхідного тегу, але питання полягає у автоматичному виведенні файлу із шляху, зазначеного у коді користувачем. Дякую!
Кумар Картікея

13

Імовірно, ви вже спробували це, введіть "false" так:

 rawFile.open("GET", file, false);

12

Спробуйте створити дві функції:

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]);
}

Для яких браузерів це працює (схоже, 6 людей спробували це :-))
Xan-Kun Clark-Davis

11

інший приклад - мій читач з класом 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>

2
Вихід файлу base64 вихід
VP

6

Використання функції Fetch і async

const logFileText = async file => {
    const response = await fetch(file)
    const text = await response.text()
    console.log(text)
}

logFileText('file.txt')

7
Я отримую "Схема URL-адреси повинна бути" http "або" https "для запиту CORS."
Qwerty

Дякую, працює для мене!
oscarAguayo

5

Це може допомогти,

    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();

5

Сучасне рішення:

<input type="file" onchange="this.files[0].text().then(t => console.log(t))">

Коли користувач завантажує текстовий файл через цей вхід, він буде записаний на консоль. Ось робоча демонстрація jsbin .

Ось більш докладна версія:

<input type="file" onchange="loadFile(this.files[0])">
<script>
  async function loadFile(file) {
    let text = await file.text();
    console.log(text);
  }
</script>

Наразі (січень 2020 року) це працює лише в Chrome та Firefox, перевірте їх на сумісність, якщо ви читаєте це в майбутньому: https://developer.mozilla.org/en-US/docs/Web/API/Blob/text

У старих браузерах це має працювати:

<input type="file" onchange="loadFile(this.files[0])">
<script>
  async function loadFile(file) {
    let text = await (new Response(file)).text();
    console.log(text);
  }
</script>

2

Додавши до деяких вищевказаних відповідей, це змінене рішення працювало для мене.

<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);
            }
        }
    }     
}

2
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 

- читати текст файлу з javascript
- Текст журналу консолі з файлу за допомогою javascript
- Google chrome та mozilla firefox

у моєму випадку у мене є така структура файлів:введіть тут опис зображення

результат console.log:
введіть тут опис зображення


Нижче показана помилка: Доступ до XMLHttpRequest у файлі '/// C: / {myLocalPath} PropertiesFile.txt' від походження 'null' був заблокований політикою CORS: Запити перехресного походження підтримуються лише для протокольних схем: http, дані, хром, розширення хрому, https.
Кумар Картікея,

1
<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>

1

Отримати дані локальних файлів у завантаженні 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);
}

файл data.js, як:

var mSdata = hereDoc(function() {/*!
17,399
1237,399
BLAHBLAH
BLAHBLAH
155,82
194,376
*/});

динамічний unixTime queryString запобігає кешування.

AJ працює в Інтернеті http: //.


чому ви не використовуєте буквальний синтаксис шаблону ES6 для багаторядкових рядків? (див. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )
Sapphire_Brick

1

Місцеві дзвінки AJAX у Chrome не підтримуються через політику того самого походження.

Повідомлення про помилку на chrome виглядає так: "Запити крос-походження не підтримуються для протокольних схем: http, data, chrome, chrome-extension, https."

Це означає, що хром створює віртуальний диск для кожного домену, щоб зберігати файли, які обслуговуються доменом, використовуючи протоколи http / https. Будь-який доступ до файлів поза цим віртуальним диском обмежений відповідно до тієї ж політики оригіналу. Запити та відповіді AJAX трапляються на http / https, тому не працюватимуть для локальних файлів.

Firefox такого обмеження не ставить, тому ваш код буде працювати на Firefox щасливо. Однак для хрому також існують шляхи вирішення: дивіться тут .


0

Ви можете імпортувати мою бібліотеку:

<script src="https://www.editeyusercontent.com/preview/1c_hhRGD3bhwOtWwfBD8QofW9rD3T1kbe/code.js?pe=yikuansun2015@gmail.com"></script>

тоді функція fetchfile(path)поверне завантажений файл

<script src="https://www.editeyusercontent.com/preview/1c_hhRGD3bhwOtWwfBD8QofW9rD3T1kbe/code.js"></script>
<script>console.log(fetchfile("file.txt"))</script>

Зверніть увагу: у Google Chrome, якщо код HTML локальний, з’являться помилки, але збереження HTML-коду та файлів в Інтернеті, а також запуск інтернет-файлу HTML, працює.


0

Для того, щоб прочитати текст локального файлу за JavaScriptдопомогою хрому, браузер chrome має запуститися з аргументом, --allow-file-access-from-filesщоб дозволити JavaScript отримати доступ до локального файлу, а потім можна прочитати його, використовуючи XmlHttpRequestнаступне:

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
   if (xmlhttp.readyState == 4) {
       var allText = xmlhttp.responseText;          
            }
        };
xmlhttp.open("GET", file, false);
xmlhttp.send(null);

0

Як прочитати локальний файл?

Використовуючи це, ви завантажите файл loadText (), тоді JS буде асинхронно чекати, поки файл буде прочитаний і завантажений після цього, він буде виконувати функцію readText (), що дозволяє продовжувати свою звичайну логіку JS (ви також можете написати спробу лову блокувати функцію loadText () у разі виникнення помилки), але для цього прикладу я тримаю її на мінімальному рівні.

async function loadText(url) {
    text = await fetch(url);
    //awaits for text.text() prop 
    //and then sends it to readText()
    readText(await text.text());
}

function readText(text){
    //here you can continue with your JS normal logic
    console.log(text);
}

loadText('test.txt');

Схоже, у вас є випадок function-itis
Sapphire_Brick

0

Я знаю, я спізнююсь на цю вечірку. Дозвольте показати вам, що я маю.

Це просте читання текстового файлу

var path = C:\\established-titles\\orders\\shopify-orders.txt
var fs = require('fs')
fs.readFile(path , 'utf8', function(err, data) {
  if (err) throw err;
  console.log('OK: ' + filename);
  console.log(data)
});

Я сподіваюся, що це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.