“仅 HTTP 支持跨源请求。” 加载本地文件时出错

IT技术 javascript file http three.js cors
2020-12-11 00:55:34

我正在尝试将 3D 模型加载到 Three.js 中JSONLoader,并且该 3D 模型与整个网站位于同一目录中。

我收到"Cross origin requests are only supported for HTTP."错误,但我不知道是什么导致了它,也不知道如何修复它。

6个回答

我的水晶球说您正在使用file://加载模型C:/,这与错误消息保持一致,因为它们不是http://

因此,您可以在本地 PC 上安装网络服务器,也可以将模型上传到其他地方,然后使用jsonp并将 url 更改为http://example.com/path/to/model

起源在RFC-6454 中定义

   ...they have the same
   scheme, host, and port.  (See Section 4 for full details.)

因此,即使您的文件来自同一主机 ( localhost),但只要方案不同 ( http/ file),它们就会被视为不同的来源。

但是我试图从我自己的目录中加载一些东西,甚至 index.html 也位于那里!
2021-02-07 00:55:34
您也可以在 chrome 中使用 --allow-file-access-from-files 开关。根据我的回答:stackoverflow.com/questions/8449716/...
2021-02-11 00:55:34
是的,我正在尝试使用file://,但我不明白为什么允许这样做。好吧,我想我正在安装 Lampp...
2021-02-24 00:55:34
想象一下,如果这被允许,并且网页的作者使用类似的东西load('file://C:/users/user/supersecret.doc')然后使用 ajax 等将内容上传到他们的服务器的 web 应用程序。
2021-02-28 00:55:34
不幸的是,政策适用于所有情况,不仅适用于您的情况:(,所以你必须忍受它
2021-03-04 00:55:34

明确地说 - 是的,错误是说您不能将浏览器直接指向 file://some/path/some.html

这里有一些选项可以快速启动本地 Web 服务器,让您的浏览器呈现本地文件

python2

如果你安装了 Python...

  1. some.html使用命令将目录更改为您的文件或文件所在的文件夹cd /path/to/your/folder

  2. 使用命令启动 Python Web 服务器 python -m SimpleHTTPServer

这将启动一个 Web 服务器来托管您的整个目录列表 http://localhost:8000

  1. 您可以使用自定义端口 python -m SimpleHTTPServer 9000为您提供链接:http://localhost:9000

这种方法内置于任何 Python 安装中。

python 3

执行相同的步骤,但使用以下命令代替 python3 -m http.server

节点.js

或者,如果您需要更灵敏的设置并且已经使用 nodejs ......

  1. http-server通过键入安装npm install -g http-server

  2. 切换到你的工作目录,你some.html住的地方

  3. 通过发出启动您的 http 服务器 http-server -c-1

这会启动一个 Node.js httpd,它将您目录中的文件作为静态文件提供 http://localhost:8080

Ruby

如果您的首选语言是 Ruby ...... Ruby Gods 说这也有效:

ruby -run -e httpd . -p 8080

PHP

当然PHP也有它的解决方案。

php -S localhost:8000
为了回应 LukeP 的评论,在 python 2.7 中,该命令确实按照说明工作$ python -m SimpleHTTPServer,它会产生以下消息:Serving HTTP on 0.0.0.0 port 8000 ...如果module名称拼写错误,例如,$ python -m SimpleHttpServer那么您将收到No module named SimpleHttpServer错误消息 如果您有 python3,您将收到类似的错误消息已安装(v. python 2.7)。您可以使用命令来检查你的Python版本:$ python --version您还可以指定要侦听的端口,如下所示:$ python -m SimpleHTTPServer 3333
2021-02-08 00:55:34
我听说Python简单而强大,就像“X”语言一样,但这太荒谬了!无需安装 XAMPP,或使用节点设置简单的 http 服务器 js 来提供静态文件 - 一个命令和繁荣!非常感谢,节省了很多时间和麻烦。
2021-02-09 00:55:34
惊人的!- 对于 Windows 上的 Python 使用:python -m http.server 8080 ...或任何你想要的端口,当你想退出它时只需 ctrl-c。
2021-02-12 00:55:34
这为我节省了大量时间,谢谢。我的 Python 安装没有 SimpleHTTPServer module,但节点指令的作用就像一个魅力。
2021-02-14 00:55:34
python 服务器从您启动服务器的目录中提供文件。因此,如果您要提供的文件位于 /Users/7stud/angular_projects/1app 中,则在该目录中启动服务器,例如$ cd ~/angular_projects/1app,然后$ python -m SimpleHTTPServer. 在浏览器中输入 url http://localhost:8000/index.html您还可以在启动服务器的目录的子目录中请求文件,例如http://localhost:8000/subdir/hello.html
2021-02-19 00:55:34

在 Chrome 中,您可以使用此标志:

--allow-file-access-from-files

在这里阅读更多。

请解释如何在 chrome 中使用它。
2021-02-11 00:55:34
请注意,fetch()无论如何仍然否认这一点。你必须XMLHttpRequest以某种方式使用
2021-02-15 00:55:34
@Priya 不应该这样做
2021-02-18 00:55:34
@Blairg23,请记住,此解决方案需要重新启动 Chrome.exe 的所有实例才能正常工作
2021-03-03 00:55:34
我建议仅将 Chromium 用于本地调试(以 flag 启动--allow-file-access-from-files)。这意味着使用 Chrome 浏览普通网页,并使用 Chromium 作为 HTML 文件的默认应用程序。
2021-03-05 00:55:34

今天跑到这个。

我写了一些看起来像这样的代码:

app.controller('ctrlr', function($scope, $http){
    $http.get('localhost:3000').success(function(data) {
        $scope.stuff = data;
    });
});

...但它应该是这样的:

app.controller('ctrlr', function($scope, $http){
    $http.get('http://localhost:3000').success(function(data) {
        $scope.stuff = data;
    });
});

唯一的区别是缺少http://第二段代码。

只是想把它放在那里,以防其他人有类似的问题。

只需将 url 更改为http://localhost而不是localhost. 如果您从本地打开 html 文件,您应该创建一个本地服务器来提供该 html 文件,最简单的方法是使用Web Server for Chrome. 这将解决问题。

+1Web Server for Chrome应用程序链接 - 迄今为止,它是 Chrome IMO 临时 httpd 设置最简单、最干净的解决方案
2021-02-18 00:55:34
它救了我。准确的解决方案
2021-03-09 00:55:34