nulla XMLHttpRequest origine non è consentito l'accesso-Control-Allow-Origin per il file: /// per file: /// (Serverless)

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

Domanda

Sto cercando di creare un sito web che può essere scaricato ed eseguito a livello locale lanciando il suo file di indice.

Tutti i file sono locali, non vengono utilizzate le risorse on-line.

Quando provo ad usare il plugin AJAXSLT per jQuery per elaborare un file XML con un modello XSL (in indici secondari), ricevo i seguenti errori:

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.

Il file di indice che effettua la richiesta è file:///C:/path/to/XSL%20Website/index.html mentre i file utilizzato il JavaScript vengono memorizzati in file:///C:/path/to/XSL%20Website/assets/js/.

Come posso fare per risolvere questo problema?

È stato utile?

Soluzione

Per i casi in cui l'esecuzione di un server web locale non è un'opzione, è possibile consentire l'accesso ai file Chrome file:// tramite un interruttore browser. Dopo un po 'di scavo, ho trovato questa discussione , che menziona un interruttore del browser in post apertura. Eseguire l'istanza di Chrome con:

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

Questo può essere accettabile per gli ambienti di sviluppo, ma poco altro. Certamente non si vuole questo su tutto il tempo. Questo sembra essere ancora un problema aperto (a partire da gennaio 2011).

Vedi anche: Problemi con jQuery getJSON utilizzando file locali in Chrome

Altri suggerimenti

In sostanza l'unico modo per affrontare questo è di avere un server web in esecuzione su localhost e di servire loro da lì.

E 'insicuro per un browser per consentire una richiesta AJAX per accedere a qualsiasi file sul vostro computer, quindi la maggior parte dei browser sembrano trattare "file: //" richieste come non avendo origine ai fini di " Same Origin Policy "

Avvio di un server web può essere così banale come cding nella directory dei file sono in esecuzione e:

python -m SimpleHTTPServer

Ecco un AppleScript che lancerà Chrome con il --allow-file-access-from-files interruttore acceso, per OSX / Chrome Devs là fuori:

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

Questa soluzione vi permetterà di caricare uno script locale utilizzando jQuery.getScript (). Questa è un'impostazione globale, ma è anche possibile impostare l'opzione crossdomain su una base per-richiesta.

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

Cosa succede ad usare la funzione di javascript FileReader per aprire il file locale, vale a dire:

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

Ora Fare clic sul pulsante Choose file e selezionare il file file:///C:/path/to/XSL%20Website/data/home.xml

Launch cromo in questo modo per aggirare questa limitazione:. open -a "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --args --allow-file-access-from-files

Josh Lee commento ma avevo bisogno di specificare il percorso completo a Google Chrome in modo da evitare di avere l'apertura di Google Chrome dal mio partizione di Windows (in Parallels).

Il modo in cui ho lavorato intorno a questo non è per uso XMLHTTPRequest a tutti, ma includono i dati necessari in un file JavaScript separato anziché. (Nel mio caso avevo bisogno di un blob binario SQLite per l'uso con https://github.com/kripken/sql js / )

Ho creato un file chiamato base64_data.js (e btoa() utilizzato per convertire i dati che avevo bisogno e inserirla in un <div> così ho potuto copiarla).

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

e quindi inserito i dati in html come javascript normale:

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

immagino che sarebbe banale di modificare il presente per leggere JSON, forse anche XML; Lascio come esercizio per il lettore;)

Si può provare a mettere in 'Access-Control-Allow-Origin':'*' response.writeHead(, {[here]}).

utilizzare il 'server web per Chrome App'. (In realtà hanno sul tuo pc, tempo che si sa o no. Basta cercare in Cortana!). aprirlo e fare clic su 'Scegli file' scegliere la cartella con il file in esso. in realtà non selezionare il file. selezionare i file della cartella , quindi fare clic sul collegamento (s) sotto il pulsante 'scegliere la cartella'.

Se doesnt prendere per il file, quindi aggiungere il nome del file per i Urs. in questo modo:

   https://127.0.0.1:8887/fileName.txt

Link al web server per Chrome: click me

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top