XMLHTTPREQUEST ORGE NULL не допускается доступом доступа-контроль-разрешения для файла: /// в файл: /// (безверенно)

StackOverflow https://stackoverflow.com/questions/4208530

Вопрос

Я пытаюсь создать веб-сайт, который можно загрузить и запустить локально, запустив его файл индекса.

Все файлы локальные, никакие ресурсы не используются в Интернете.

Когда я пытаюсь использовать плагин AjaxSLT для jQuery для обработки файла XML с шаблоном XSL (в Sub Ciredies), я получает следующие ошибки:

XMLHttpRequest cannot load file:///C:/path/to/XSL%20Website/data/home.xml. Origin null is not allowed by Access-Control-Allow-Origin.

XMLHttpRequest cannot load file:///C:/path/to/XSL%20Website/assets/xsl/main.xsl. Origin null is not allowed by Access-Control-Allow-Origin.

Индекс файла, создающий запрос file:///C:/path/to/XSL%20Website/index.html В то время как используемые файлы JavaScript хранятся в file:///C:/path/to/XSL%20Website/assets/js/.

Как я могу сделать, чтобы исправить эту проблему?

Это было полезно?

Решение

Для экземпляров, где работает локальный веб-сервер, не является опцией, вы можете разрешить Chrome Access к file:// Файлы через переключатель браузера. После некоторого копания я нашел Это обсуждение, который упоминает переключатель браузера в открывшемся посте. Запустите экземпляр Chrome с:

chrome.exe --allow-file-access-from-files

Это может быть приемлемо для сред разработки, но мало других. Вы, безусловно, не хотите этого все время. Это все еще представляется открытой проблемой (по состоянию на январь 2011 года).

Смотрите также: Проблемы с jquery getjson с помощью локальных файлов в Chrome

Другие советы

По сути, единственный способ справиться с этим, чтобы иметь веб-сервер, работающий на localhost и обслуживать их оттуда.

Для браузера небезопасно, чтобы позволить запросу AJAX доступа к любому файлу на вашем компьютере, поэтому большинство браузеров, кажется, для лечения «Файл: //» запросы, как отсутствие происхождения для целей «Та же политика происхождения"

Запуск веб-сервера может быть таким же тривиальным, как cdВ каталог файлы входят и работает:

python -m SimpleHTTPServer

Вот настроен AppleScript, который запустит Chrome с включенным включенным выключателем файлов-файла-файла-файла-файлов, для DEV OSX / Chrome out out:

set chromePath to POSIX path of "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"    
set switch to " --allow-file-access-from-files"
do shell script (quoted form of chromePath) & switch & " > /dev/null 2>&1 &"

Это решение позволит загрузить локальный скрипт, используя jquery.getscript (). Это глобальный обстановка, но вы также можете установить опцию Crossdomain на основе запроса.

$.ajaxPrefilter( "json script", function( options ) {
  options.crossDomain = true;
});

Как насчет использования JavaScript Filereader Функция, чтобы открыть локальный файл, т. Е.

<input type="file" name="filename" id="filename">
<script>
$("#filename").change(function (e) {
  if (e.target.files != undefined) {
    var reader = new FileReader();
    reader.onload = function (e) {
        // Get all the contents in the file
        var data = e.target.result; 
        // other stuffss................            
    };
    reader.readAsText(e.target.files.item(0));
  }
});
</script>

Теперь нажмите Choose file Кнопка и просмотрите файл file:///C:/path/to/XSL%20Website/data/home.xml

Запустите Chrome, как так, чтобы обойти это ограничение: open -a "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --args --allow-file-access-from-files.

Полученный из Комментарий Джош Ли Но мне нужно было указать полный путь к Google Chrome, чтобы избежать открытия Google Chrome из раздела Windows (в параллелях).

То, как я только что работал, это не использовать XMLHTTPREQUEST вообще, но вместо этого включают данные, необходимые в отдельном файле JavaScript. (В моем случае мне нужен бинарный SQLite Blob для использования с https://github.com/kripken/sql.js/)

Я создал файл под названием base64_data.js (и используется btoa() Чтобы преобразовать данные, которые мне нужны, и вставьте его в <div> Так что я мог бы скопировать его).

var base64_data = "U1FMaXRlIGZvcm1hdCAzAAQA ...<snip lots of data> AhEHwA==";

А потом включали данные в HTML, как обычный JavaScript:

<div id="test"></div>

<script src="base64_data.js"></script>
<script>
    data = atob(base64_data);
    var sqldb = new SQL.Database(data);
    // Database test code from the sql.js project
    var test = sqldb.exec("SELECT * FROM Genre");
    document.getElementById("test").textContent = JSON.stringify(test);
</script>

Предлагаю, что это будет тривиально изменить это, чтобы прочитать JSON, может быть, даже XML; Я оставлю это как упражнение для читателя;)

Вы можете попробовать положить 'Access-Control-Allow-Origin':'*' в response.writeHead(, {[here]}).

Используйте веб-сервер для приложения Chrome. (У вас на самом деле есть это на вашем компьютере, вы знаете или нет. Просто ищите его в Cortana!). Откройте его и нажмите «Выбрать файл» Выберите папку с помощью файла в нем. На самом деле не выберите свой файл. Выберите папку «Ваши файлы» Затем нажмите на ссылку (ы) под кнопкой «Выберите папку».

Если это не приведет вас к файлу, добавьте имя файла на URS. так:

   https://127.0.0.1:8887/fileName.txt

Ссылка на веб-сервер для Chrome: нажми на меня

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top