XMLHttpRequest Origin null не дозволено Access-Control-Allow-Origin для файлу: /// до файлу: /// (без сервера)


209

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

Усі файли локальні, ресурси не використовуються в Інтернеті.

Коли я намагаюся використовувати плагін AJAXSLT для jQuery для обробки файлу XML з шаблоном XSL (у підкаталогах), я отримую такі помилки:

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

Як я можу вирішити цю проблему?

Відповіді:


177

У випадках, коли локальний веб-сервер не є можливим, ви можете дозволити Chrome доступ до file://файлів через перемикач браузера. Після деякого копання я знайшов цю дискусію , в якій згадується перемикач браузера у відкритті. Запустіть свій примірник Chrome:

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

Це може бути прийнятним для середовищ розробки, але мало іншого. Ти, звичайно, не хочеш цього постійно. Це все ще залишається відкритим питанням (станом на січень 2011 року).

Дивіться також: Проблеми з jQuery getJSON при використанні локальних файлів у Chrome


1
@Rich, рада, що допомогло! Цікаво, чи буде більший попит на це з поштовхом Google до програм на базі браузера. Я думаю, попит лише зростатиме.
Кортні Крістенсен

4
це було корисно для Маков OS X cweagans.net/blog/2011/1/24 / ...
Kinet

1
Дякую, мені було цікаво, де я неправильно кодував, здається, у браузері це проблема.
Арда

4
Чи є якась причина --allow-file-access-from-files не вирішить проблему. Я просто намагаюся завантажити файл сценарію, як-от $ .getScript ("application.js"); і отримайте помилку, описану у питанні.
Денцо

1
Це працює, проте "Перш ніж виконати команду, переконайтесь, що все ваше вікно Chrome закрито і не працює іншим чином. Або парам командного рядка не буде ефективним." Chrome.exe --allow-file-access-from- файли "" ( stackoverflow.com/a/4208455/1272428 )
rluks

87

По суті єдиний спосіб впоратися з цим - це запустити веб-сервер на localhost і обслуговувати їх звідти.

Веб-браузер небезпечно дозволити запиту ajax отримати доступ до будь-якого файлу на вашому комп’ютері, тому, здається, більшість браузерів трактує запити "file: //" як такі, що не мають походження для цілей "тієї ж політики оригіналу "

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

python -m SimpleHTTPServer

1
Я сподіваюся розробити рішення, яке не вимагає від користувача нічого іншого, ніж їх веб-браузер. Використання Python, будь-якого перекладача чи будь-якого несистемного програмного забезпечення не є життєздатним.
Кевін Еррера

5
Ну єдине інше рішення, про яке я можу придумати, - це завантажити всю річ на одній сторінці, щоб вам не потрібно було робити жодних запитів на ajax до файлової системи.
Одномісний

2
Дякую @Singletoned! Я використовую ваше рішення, і це дуже зручно!
Хенді Іраван

4
І якщо ви використовуєте Python 3, команда була б python -m http.server.
alextercete

4

Ось яблучний сценарій, який запустить Chrome із увімкненим перемикачем --allow-file-access-from-files для ОСХ / Chrome розробників там:

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

14
Ви можете просто використовувати відкриті (1) , щоб додати прапори: open -a 'Google Chrome' --args --allow-file-access-from-files.
Джош Лі

4

Це рішення дозволить завантажити локальний скрипт за допомогою jQuery.getScript (). Це глобальне налаштування, але ви також можете встановити параметр crossDomain на основі запиту.

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

працював як шарм для завантаження локального файлу js з локального html-файлу! дякую, саме те, що мені було потрібно.
користувач1577390

4

Як щодо використання функції FileReader javascript для відкриття локального файлу, тобто:

<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


3

Запуск хром , як так , щоб обійти це обмеження: open -a "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --args --allow-file-access-from-files.

Отриманий з коментаря Джоша Лі, але мені потрібно було вказати повний шлях до Google Chrome, щоб уникнути відкриття Google Chrome з мого розділу Windows (у паралелях).


2

Я просто працював над цим, щоб не використовувати XMLHTTPRequest взагалі, а включати дані, необхідні в окремому файлі javascript. (У моєму випадку для використання з https://github.com/kripken/sql.js/ мені потрібен був бінарний блок SQLite )

Я створив файл під назвою 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; Я залишу це як вправу для читача;)


1

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


6
звідки походить response.writeHead, як я це називаю і де? Чи можете ви навести більше прикладів? Майте на увазі, що це локальна файлова система, а не сервер. Я розумію, що значення можна встановити лише з сервера?
Йосип Астрахан

0

використовуйте "веб-сервер для програми Chrome". (у вас насправді це є на вашому ПК, чим це ви знаєте чи ні. Просто шукайте його в Кортані!). відкрийте його і натисніть «вибрати файл», виберіть папку з файлом у ній. насправді не вибирайте файл. виберіть папку з файлами, а потім натисніть на посилання під кнопкою "вибрати папку".

якщо він не бере вас у файл, то додайте ім'я файлу до urs. подобається це:

   https://127.0.0.1:8887/fileName.txt

посилання на веб-сервер для хрому: натисніть на мене

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