83 votes

L'accès à l'image depuis l'origine 'null' a été bloqué par la politique CORS.

J'ai une application JavaScript dans OpenLayers 3, et ma couche de base est créée à partir de tuiles locales. Je ne travaille que sur mon ordinateur et je ne sais pas pourquoi j'ai une erreur CORS.

    var newLayer = new ol.layer.Tile({
    source: new ol.source.OSM({
        url: 'E:/Maperitive/Tiles/vychod/{z}/{x}/{y}.png'
    })
});
var schladming = [21.6187, 48.7327]; // longitude first, then latitude
// since we are using OSM, we have to transform the coordinates...
var schladmingWebMercator = ol.proj.fromLonLat(schladming);

var map = new ol.Map({
    layers: [
        newLayer
    ],
    controls: [],
    target: 'mapid',
    view: new ol.View({
        center: schladmingWebMercator,
        zoom: 10,
        minZoom: 10,
        maxZoom: 14
    })
});

message d'erreur de la console :

Accès à l'image à file:///E:/Maperitive/Tiles/vychod/10/573/352.png d'origine null a été bloqué par la politique CORS : Réponse invalide. Origine null n'est donc pas autorisé à y accéder.

Lorsque je double-clique sur l'URL de l'image, celle-ci s'ouvre. Avez-vous une idée de ce qui ne va pas ? Je n'ai jamais eu cette erreur auparavant.

4 votes

El file:// ne fonctionne pas avec les CORS - seul un certain nombre d'entre eux fonctionnent, par exemple http:// entre autres.

1 votes

Mais je ne travaille que dans un seul domaine ou je me trompe ? Comment puis-je résoudre ce problème ?

0 votes

J'utilise le serveur live sur vs code mais cela ne fonctionne pas pour moi. J'obtiens également la même erreur.

49voto

Jeremy Iglehart Points 1456

Vous rencontrez une erreur CORS.

Essayer d'accéder à votre fichier en utilisant le système de fichiers local ne fonctionne pas dans votre cas.

Origin est nulle car c'est votre système de fichiers local . Pourriez-vous hôte ce fichier png ?

Suggestion :

Hébergez plutôt ces fichiers dans un seau AWS S3. Vous pouvez alors utiliser la fonction http plutôt que le protocole file protocole. OU installer un serveur http sur votre système local et utiliser http à votre localhost pour servir les fichiers si vous voulez garder tout en local.

Plus de lecture :

Comment fonctionne CORS

3 votes

Ainsi, mes propres images que j'ai créées et qui proviennent de localhost (en tant que file:/// ) sont maintenant une menace pour moi ? Les comités de normalisation ont-ils perdu la raison ?

1 votes

Je pense que cela a davantage à voir avec la protection contre les éléments qui se lancent automatiquement dans les navigateurs à partir de choses comme les clés USB, ou d'autres types de codes malveillants qui veulent s'exécuter dans le navigateur.

1 votes

Mais cela ne résout pas vraiment le problème [de la protection contre les virus JS]. Si votre travail consiste à créer des logiciels malveillants, l'encodage base64 des images (en fait, de tout ce qui est binaire) et la construction de tout dans un seul fichier html est en fait assez trivial, et vous n'avez plus de blocs CORS. Webpack est génial pour ce genre de choses. J'ai l'impression que tout cela ne fait que compliquer la vie des amateurs tout en n'arrêtant pas vraiment ceux qui ont l'intention d'écrire des malwares JS, mais il est possible que je ne voie pas quelque chose d'évident ici.

19voto

Sadjad Esfandiari Points 116

Le problème a en fait été résolu en fournissant crossOrigin : null à la source OpenLayers OSM :

var newLayer = new ol.layer.Tile({
source: new ol.source.OSM({
    url: 'E:/Maperitive/Tiles/vychod/{z}/{x}/{y}.png',
    crossOrigin: null
    })
});

3 votes

Semble être un piratage intelligent plus qu'une solution prévue. Mais bon travail quand même.

4 votes

Pouvez-vous fournir plus de détails ?

0 votes

Cela a fonctionné pour moi sur Open Layers 6

11voto

Kit Points 494

Sous la couverture, il y aura une certaine forme de demande de chargement d'URL. Vous ne pouvez pas charger des images ou tout autre contenu via cette méthode à partir d'un système de fichiers local.

Votre image doit être chargée via un serveur web, donc accessible via une URL http appropriée.

6voto

Damien Doumer Points 175

Une solution à cela est de servir votre code, et de le faire fonctionner sur un serveur, vous pouvez utiliser le serveur web pour chrome pour servir facilement vos pages.

0 votes

Pouvez-vous expliquer pourquoi cela résout le problème ? N'oubliez pas qu'une bonne explication permet aux autres d'apprendre de votre réponse.

3voto

Mike Points 2690

Dans ce cas, le problème CORS a été causé par l'utilisation du mauvais constructeur de source dans OpenLayers. ol.source.OSM est destiné à accéder aux tuiles OpenStreetMap par défaut à partir du web et pour cette raison, la valeur par défaut est crossOrigin : 'anonymous'. Si vous utilisez une URL source locale, vous devez utiliser le constructeur générique ol.source.XYZ qui ne définit pas par défaut le paramètre crossOrigin (c'est pourquoi le paramètre crossOrigin:null ci-dessus a fonctionné). Et il est parfaitement légitime de vouloir utiliser le protocole de fichier pour les cartes, par exemple sur la carte SD d'un appareil mobile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X