JQuery: чтение текстового файла из файловой системы
Я пытаюсь прочитать текстовый файл с помощью jquery, например:
// LOAD file and split line by line and append divs
$.get('myFile.txt', function(data) {
var lines = data.split("\n");
$.each(lines, function(n, elem) {
$('#myContainer').append('<div>' + elem + '</div>');
});
});
В хром я получаю:
XMLHttpRequest cannot load file:///C:/myPath/myFile.txt. Origin null is not allowed by Access-Control-Allow-Origin.
Firefox не показывает ошибки, но код не выполняется (у меня есть точки останова в firebug, и анонимная функция никогда не запускается).
Любая помощь оценивается!
ИЗМЕНИТЬ
пришлось:
- используйте полный путь к файлу
- запуск
хром с
"--allow-доступ к файлам, из файлов"
теперь он работает нормально!
Ответы
Ответ 1
Вы не можете загрузить файл из своей локальной файловой системы, например, вам нужно разместить его на веб-сервере и загрузить его оттуда. На том же сайте, на котором загружен JavaScript.
РЕДАКТИРОВАТЬ: Посмотрите на thread, вы можете запустить chrome с помощью опции --allow-file-access-from-files
, которая разрешит доступ к локальным файлам.
Ответ 2
укажите полный путь к файлу url
Ответ 3
Это нормально работает в firefox по крайней мере.
Проблема, с которой я столкнулась, заключается в том, что я получил объект XML вместо простой текстовой строки. Чтение xml файла с моего локального диска отлично работает (тот же каталог, что и html), поэтому я не понимаю, почему проблема с чтением текстового файла была проблемой.
Я понял, что мне нужно сообщить jquery, чтобы передать строку вместо XML-объекта. Это то, что я сделал, и он, наконец, работал:
function readFiles()
{
$.get('file.txt', function(data) {
alert(data);
}, "text");
}
Обратите внимание на добавление "текста" в конце. Это сообщает jquery передать содержимое файла file.txt в виде строки вместо объекта XML. В окне предупреждения появится содержимое текстового файла. Если вы удалите "текст" в конце, в поле предупреждения появится "XML-объект".
Ответ 4
этот работает
$.get('1.txt', function(data) {
//var fileDom = $(data);
var lines = data.split("\n");
$.each(lines, function(n, elem) {
$('#myContainer').append('<div>' + elem + '</div>');
});
});
Ответ 5
Обходной путь для этого я использовал для включения данных в виде js файла, который реализует функцию, возвращающую необработанные данные в виде строки:
HTML:
<!DOCTYPE html>
<html>
<head>
<script src="script.js"></script>
<script type="text/javascript">
function loadData() {
// getData() will return the string of data...
document.getElementById('data').innerHTML = getData().replace('\n', '<br>');
}
</script>
</head>
<body onload='loadData()'>
<h1>check out the data!</h1>
<div id='data'></div>
</body>
</html>
script.js
// function wrapper, just return the string of data (csv etc)
function getData () {
return 'look at this line of data\n\
oh, look at this line'
}
Смотрите здесь в действии - http://plnkr.co/edit/EllyY7nsEjhLMIZ4clyv?p=preview
Недостатком является то, что вам нужно выполнить некоторую предварительную обработку файла для поддержки многострочных (добавьте каждую строку в строку с помощью '\n\'
).
Ответ 6
Это не работает, и это не должно быть потому, что это будет гигантская дыра в безопасности.
Посмотрите на новый API файловой системы. Он позволяет запрашивать доступ к виртуальной, изолированной файловой системе, управляемой браузером. Вам придется попросить вашего пользователя "загрузить" свой файл в изолированную файловую систему один раз, но впоследствии вы сможете работать с ним очень элегантно.
Хотя это определенно будущее, оно все еще очень экспериментально и работает только в Google Chrome, поскольку CanIUse знает.
Ответ 7
Пока файл не требуется динамически генерировать, например, простой текстовый или html файл, вы можете протестировать его локально БЕЗ веб-сервера - просто используйте относительный путь.
Ответ 8
Если вы включите поле ввода файла, вы можете получить доступ к файлу в виде строки в кодировке base64 с помощью объекта FileReader. Если это текстовый файл, то для получения текста будет работать простое декодирование base64.
Предполагая следующий HTML:
<input type="file" id="myfile" />
Вы можете получить доступ, используя следующий JQuery JS:
var file = $('#myfile').get(0).files[0];
var reader = new FileReader();
reader.onload = function (e) {
//get the file result, split by comma to remove the prefix, then base64 decode the contents
var decodedText = atob(e.target.result.split(',')[1]);
//show the file contents
alert(decoded);
};
reader.readAsDataURL(file);
Ответ 9
Вы не можете сделать это без WEB-SERVER!!!. Chrome отправляет XMLHttpRequest в систему, которая выглядит примерно так.
GET /myFile.txt HTTP/1.1
И операционная система не слушает порт 80, чтобы получить это! И даже если это так, он должен реализовать HTTP-протокол для связи с браузером...
Чтобы получить эту работу, вы должны установить WEB SERVER в своей системе, которая будет прослушивать порт 80 и делать ваши файлы доступными через HTTP-соединение, тем самым делая ваш код работоспособным.