2017-01-20 2 views
1

Скажите, пожалуйста, почему локальный javascript не может открыть локальный файл? Я пытаюсь создать простое приложение javascript/html, которое должно запускаться на локальном компьютере из локальной файловой системы. Это приложение пытается прочитать файл конфигурации (JSON), используя различные методы, но получает следующие ошибки (Chrome):Локальный javascript не может открыть локальный файл

  1. В случае XMLHttpRequest, метод open("GET", filename, true) бросает исключение:

    XMLHttpRequest невозможно загрузить файл: /// bla-bla-bla. Запросы на кросс-начало поддерживаются только для схем протокола: http, data, chrome, chrome-extension, https, chrome-extension-resource.

  2. В случае document.createElement("iframe").src=filename у меня есть еще одно исключение:

    VM596: 1 Uncaught DOMException: Не удалось прочитать свойство 'contentDocument' от 'HTMLIFrameElement': Blocked кадр с происхождения "нулевой" из доступ к кросс-происхождения кадра.»

  3. в случае var f=new File([], filename, { type: "text/plain" }); у меня есть объект файла с нулевым размером и без ошибок на всех. FileReader возвращает пустой результат тогда.

Итак, мои вопросы: Почему это «кросс-происхождение»? Эти файлы хранятся в одном каталоге! И как я могу открыть локальный файл из той же директории origin /, с которой я запускаю скрипт? Пожалуйста, помогите.

P.S .: Да, я знаю о --allow-file-access-from-files, но мне нужно запустить это клиентами.

+2

Протокол 'file: //' действительно имеет очень ограниченное использование, предназначенное для тестирования или просмотра одного отдельного файла. Для правильного тестирования Webapp вы захотите настроить небольшую базовую программу «веб-сервера», которая может принимать запросы на «localhost/index.html» или «localhost/bla-bla-bla.js». Например, Python позволяет установить один из них в текущей папке с помощью командной строки с помощью 'python -m SimpleHttpServer 80' – Katana314

+0

@BbIKTOP, tou может преобразовать файл JSON в файл javascript (добавьте« var myVariable = 'в начало json-файл), а затем включить его, используя '' данные будут в 'myVariable' (объект). Не лучшее решение, но работает. –

+0

У них более 100 ПК без локальной сети, работает очень специфическое программное обеспечение (тренажерный зал), и это приложение предназначено для показа рекламных видеороликов. Вот почему невозможно использовать такое очевидное решение с веб-сервером, поэтому я спрашиваю об этом. Несомненно, можно не использовать конфигурацию json, но вставить код в код, возможно, в отдельный файл. Это не интересно, и здесь нет необходимости спрашивать и обсуждать его. – BbIKTOP

ответ

1

Что вы можете сделать, чтобы прочитать ваши.json file, должен объявить его .js.

data.js

var data = `{"value1": 10, "value2": "hello"}` 

index.html

<script src="data.js"></script> 

<script> 
    console.log(JSON.parse(data)) 
</script> 

Это напечатает

Object {value1: 10, value2: "hello"} 

Оба из них должны находиться в том же каталоге, в противном случае вы должны изменить i mport данных.js.

+0

Почему я могу поместить его в тот же файл, зачем мне использовать data.js? Так же просто, как ' ' – BbIKTOP

+0

@BbIKTOP Таким образом, вы сохраняете свои данные отдельно от исходного кода. Идея состоит в том, чтобы использовать data.js в качестве гипотетического data.json. Если вам нужно изменить значение «v2» на 3, вы можете без него открыть исходный код. –

+0

Это будет код, а не данные, тогда – BbIKTOP

4

Почему это «кросс-происхождение»? Эти файлы хранятся в одном каталоге!

Поскольку хром считает всеfile:// URL-адреса для кросс-координат друг к другу.

И как я могу открыть локальный файл из того же источника/каталога, в котором я запускаю скрипт?

От Chrome? Вы этого не сделаете. Если вы не отключите CORS полностью с опцией командной строки (это плохая идея, так как трижды легко забыть, что вы установили эту опцию командной строки и перешли на веб-сайт, оставив вас в открытом доступе, чтобы использовать наличные деньги на факт, что вы отключили безопасность в Интернете).

Другие браузеры могут обрабатывать происхождение null по-разному.

Вместо этого запустите локальный веб-сервер и сделайте файлы доступными через локальный веб-сервер. Затем вы можете получить к ним доступ, потому что это будет URL-адрес http того же происхождения, а не URL-адрес file. Или используйте любую из дюжины фреймворков, которые позволяют писать приложения в JavaScript (а не использовать браузер). Или простой скрипт NodeJS, обслуживающий файлы (длина около 10 строк). И т.д.

+0

Все «файлы» - это кроссингоны? Очень умный и умный дизайн))))))) Итак, не существует способа сделать такое приложение? Уверен, у меня есть сервер и понимаю, как это сделать с сервером, это так просто, но вопрос в том, можно ли добиться этого без него. Неправильно устанавливать веб-сервер на любом встроенном ПК, который им нужен, чтобы запустить эту хрень. И эти ПК вообще не подключены к сети. – BbIKTOP

+0

@BbIKTOP: Я ответил на этот вопрос: вы не можете. (И ругаться не получается в Stack Overflow.) Вместо этого используйте любое из нескольких решений «сделайте приложение с JavaScript». Сделайте свою систему узлом. Или любой из дюжины других подобных решений. –

+1

@BbIKTOP Тот факт, что ПК не подключен к сети, не имеет значения. Идея состоит в том, чтобы запустить встроенный веб-сервер в течение всего процесса подачи заявки.Он должен прекратить работу, когда приложение закрывается, потому что это часть приложения, а не другой сервер в другом месте в сети. Вы использовали бы порт, отличный от 80, потому что вы действительно не пытаетесь служить в Интернете. См. Например: http://stackoverflow.com/questions/3001185/what-is-the-recommended-way-of-running-a-embedded-web-server-within-a-desktop-ap – ThisClark

Смежные вопросы