【问题标题】:Using AJAX to read from local filesystem without a web server在没有 Web 服务器的情况下使用 AJAX 从本地文件系统读取
【发布时间】:2016-03-16 19:10:30
【问题描述】:

我尝试在 HTML 文件的脚本标记中执行此操作,只是想看看我是否可以让它以某种方式工作:

<script>

    var file = '/Users/amills001c/suman/test/output/test1.txt';

    $.get(file);

</script>

正如预期的那样,我遇到了一个错误:

XMLHttpRequest 无法加载 文件:///Users/amills001c/suman/test/output/test1.txt。 跨源请求仅支持协议方案:http, 数据、chrome、chrome-extension、https、chrome-extension-resource。

所以我的问题是,有没有办法使用 AJAX 从本地文件系统请求文件,而无需设置 Web 服务器?

似乎可能,但听起来我需要做一些配置。这仅适用于本地文件并在我的本地工作站上运行浏览器。

【问题讨论】:

  • 想想这背后的安全问题……你真的认为这可能吗?
  • 是的,如果你用某些标志启动 chrome,或者使用 firefox,它看起来是可能的
  • 不可能,句号。
  • SO上有很多类似的问题,比如这个:stackoverflow.com/questions/30135589/…
  • @LukePark 它使用是可能的,并且有足够多的旧网页谈论它。哎呀,我最近在查看我的一个古老项目时遇到了这个问题。

标签: javascript jquery ajax google-chrome


【解决方案1】:

如果您也从该文件运行您的主页并启用浏览器以使用本地文件,您应该能够做到这一点。在 chrome 中有一个选项 --allow-file-access-from-files 允许这样做。

【讨论】:

    【解决方案2】:

    如果启用了 ActiveX,Internet Explorer 将加载本地文件。这在 Windows 10 中有效。

    <html>
    <head>
    <script>
    function readZeFile() {
      try {
        var oField = document.getElementById("z_file");
        var oFS = new ActiveXObject("Scripting.FileSystemObject");
        var oStream = oFS.OpenTextFile(oField.value, 1);
        var sContents = oStream.readAll();
        oStream.Close();
        document.getElementById("BoxFileContents").innerHTML = sContents;
      } catch (e) {
        window.alert(e);
      }
    }
    </script>
    </head>
    <body>
    
    <input type="file" name="z_file" id="z_file" size="50" />
    <input type="button" onclick="readZeFile()" value="Read ze file" />
    
    <pre id="BoxFileContents" style="border: 1px dotted black; height: 10em; width: 500; overflow: scroll; ">
    [Nothing loaded]
    </pre>
    
    </body>
    </html>
    

    【讨论】:

      【解决方案3】:

      您说 web 服务器,所以我不确定您是否在问题中排除了 本地服务器。但是,如果你使用 node.js 或 python 或其他方式运行 localhost 服务器,你确实可以使用 AJAX 加载文件,因为它是同一个来源。

      不如在 Web 浏览器中运行 index.html 方便,但这里有一个准系统 HTTP 服务器,可以很好地托管本地文件。 https://www.npmjs.com/package/http-server

      【讨论】:

      • 是的,谢谢,这会起作用,但是让 Chrome 读取文件会更方便一些
      • 是的,网络服务器是指任何服务器,本地或远程
      【解决方案4】:

      使用相对路径:

      var file = 'suman/test/output/test1.txt';
      $.get(file);
      

      【讨论】:

      • 那也行不通。您不能将 XMLHttpRequest 用于本地文件,故事结束。
      • @duskwuff 如果服务器在本地主机上运行,​​它会加载文件,因为它的来源相同,不是吗?
      • 对,因此是相对路径。
      • @JCD 没有。根本不涉及服务器;该页面是直接从文件加载的(即file: 方案),这是同源策略的一个例外。问题中的路径,其实已经相对于file:///!
      • 我们可能在谈论不同的事情,因为我在这里专门讨论的是服务于 HTTP 的本地主机,而不是 file:// 方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      相关资源
      最近更新 更多