Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.05.2019, 18:49
Аспирант
Отправить личное сообщение для provigator Посмотреть профиль Найти все сообщения от provigator
 
Регистрация: 20.01.2017
Сообщений: 32

<XMLHttpRequest> прочитать локальный файл
есть внешний файл data.txt, в том же каталоге что и javascript
надо получить данные из него через XMLHttpRequest

var xhr = new XMLHttpRequest()
xhr.open("GET", "data.txt")
xhr.onreadystatechange = function() {
	if(xhr.readyState == 4)
		console.log(xhr.responseText)
}
xhr.send()

если этот скрипт и data.txt расположены на сервере, то xhr.responseText получает содержимое data.txt
скрипт работает

у меня задача запускать скрипт с жесткого диска
data.txt в том же каталоге

при запуске с диска xhr.responseText не получает содержимое data.txt

возможно ли прочитать файл локально(с жесткого диска), через XMLHttpRequest() ?

использую Google Chrome
Ответить с цитированием
  #2 (permalink)  
Старый 11.05.2019, 19:15
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Локальные вызовы Ajax будут блокироваться браузерами по соображению безопасности. Но сейчас доступны иные методы, например fetch. Может его будет достаточно?
Ответить с цитированием
  #3 (permalink)  
Старый 11.05.2019, 20:21
Аспирант
Отправить личное сообщение для provigator Посмотреть профиль Найти все сообщения от provigator
 
Регистрация: 20.01.2017
Сообщений: 32

если никак через XHR, то буду использовать fetch

Последний раз редактировалось provigator, 07.07.2019 в 01:37.
Ответить с цитированием
  #4 (permalink)  
Старый 11.05.2019, 21:43
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от provigator
если никак через XHR, то буду использовать fetch
Но это тоже самое и не работает по-умолчанию в целях безопасности!

laimas, вы не можете получить и оперировать содержимым файла, если вы используете протокол file:/// ни при помощи класса XMLHttpRequest, ни при помощи Fetch API, ни при помощи класса HTMLIFrameElement или каким-либо другим способом!
Код:
Fetch API cannot load file:///Users/valentin/javascript/test/data.txt. URL scheme must be "http" or "https" for CORS request.
laimas, Fetch API предназначен для работы с сетью, а не с файловой системой!

Сообщение от provigator
у меня задача запускать скрипт с жесткого диска
data.txt в том же каталоге
provigator, вы можете это сделать!

Google Chrome запущенный с аргументами в терминале

Допустим у вас в папке есть основной файл index.html с кодом, который вы привели выше и файл с данными data.txt. Перейдите в эту папку в терминале и запустите Google Chrome со следующими аргументами...
Код:
chrome --no-first-run --no-default-browser-check --allow-file-access-from-files --temp-profile --allow-external-pages --allow-file-access --user-data-dir=./chrome-data -open ./index.html
  • Параметр --user-data-dir необходим для предотвращения использования Chrome профиля по умолчанию (он создаст в вашей папке папку chrome-data, как я указал выше)
  • Параметр -open <url> указывает, какой файл запустить

После запуска этой команды откроется ваш index.html в отдельном экземпляре браузера, который не будет связан с вашим уже открытым браузером, в котором можно будет читать локальные файлы!

Почему я написал просто chrome в терминале? Потому что до этого выполнилось
Код:
alias chrome="/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome"
которое прописано в ~/.zshrc (для zsh) или в ~/.bash_profile (для bash).
На самом деле вы можете вместо chrome указать сразу путь к исполняемому файлу браузера. Если вы не можете найти путь, то посмотрите через Activity Monitor / System Monitor / Task Manager.
Ответить с цитированием
  #5 (permalink)  
Старый 12.05.2019, 04:32
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Malleys
laimas, вы не можете получить и оперировать содержимым файла
Рядом кладем файл и получим, вот только Хром да, будет блокировать.
Ответить с цитированием
  #6 (permalink)  
Старый 12.05.2019, 05:40
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Функция fetch асинхронно совершает преобразование из представителя класса Request в представителя класса Response. Спецификация насчёт этого (протокол file) не предусматривает никаких шагов по возвращению представителя класса Response.
Ответить с цитированием
  #7 (permalink)  
Старый 12.05.2019, 05:45
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

const readFile = async file => {
    var response = await fetch(file),
    text = await response.text();
    console.log(text);
};
readFile('name.txt');


К сожалению тут не запустить, но консоль будет отображать содержимое файла.
Ответить с цитированием
  #8 (permalink)  
Старый 12.05.2019, 16:33
Аспирант
Отправить личное сообщение для provigator Посмотреть профиль Найти все сообщения от provigator
 
Регистрация: 20.01.2017
Сообщений: 32

laimas, попробовал в Chrome, Edge, IE - не работает
какой браузер используете?
Ответить с цитированием
  #9 (permalink)  
Старый 12.05.2019, 17:04
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от provigator
какой браузер используете?
Лиса, а в остальных нужно разрешать, как это сделать в Хроме Malleys, выше показывал.

PS. Кстати, а какова цель этого? Если веб приложение и для себя, то можно, иначе забудьте об этом. Если это локальная задача и устраивает IE, забудьте о веб и пишите приложение, под IE это может быть .hta.

Последний раз редактировалось laimas, 12.05.2019 в 17:44.
Ответить с цитированием
  #10 (permalink)  
Старый 12.05.2019, 18:10
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от laimas
Лиса
laimas, что вы людям голову морочите, если fetch и работает таким образом, то это ошибка, bug! Например, в Firefox Quantum 66.0.4 при запуске вашего скрипта в консоли пишет:
Код:
TypeError: NetworkError when attempting to fetch resource.
Сообщение от laimas
а в остальных нужно разрешать
В Google Chrome 74.0.3729.131 при запуске вашего скрипта (с флагами) в консоли пишет:
Код:
Fetch API cannot load file:///Users/valentin/javascript/test/data.txt. URL scheme "file" is not supported.
Сообщение от laimas
как это сделать в Хроме Malleys, выше показывал.
Я показывал для примера кода автора с XMLHttpRequest! В Firefox сразу работает, в Chrome с флагами работает, как выше показывал.

Fetch API предназначено для работы с сетью.
Если вам нужна работа с файловой системой, то, например, можете использовать fs из node.js. node.js идёт вместе с Google Chrome, например, в NW.js, Electron.js.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли как-то открыть локальный файл на редактирование Korchiy Общие вопросы Javascript 0 13.07.2016 16:02
Помогите! Нужно прочитать файл с сервера. йцукенгшщзхъ Общие вопросы Javascript 5 06.08.2014 12:39
Ссылка на локальный файл сервера lysachok Общие вопросы Javascript 0 10.05.2012 14:30
Прочитать текстовый файл Sergey_New Общие вопросы Javascript 29 03.09.2011 15:20
Как прочитать файл? SunYang Общие вопросы Javascript 7 01.02.2010 11:13