无法打开本地文件 - Chrome:不允许加载本地资源

IT技术 javascript google-chrome window.open
2021-01-11 13:23:01

测试浏览器:Chrome 版本:52.0.2743.116

这是一个简单的 javascript,用于从本地打开图像文件,如 'C:\002.jpg'

function run(){

   var URL = "file:///C:\002.jpg";

   window.open(URL, null);

}
run();

这是我的示例代码。 https://fiddle.jshell.net/q326vLya/3/

请给我任何合适的建议。

6个回答

我们在课堂上经常使用 Chrome,因此必须处理本地文件。

我们一直在使用的是“Web Server for Chrome”。您启动它,选择希望使用的文件夹并转到 URL(例如您选择的 127.0.0.1:port)

它是一个简单的服务器,不能使用 PHP,但对于简单的工作,可能是您的解决方案:

https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb

@john-cj 除非您允许访问本地计算机,否则根本没有害处。您正在使用带有本地端口的计算机。如果您将本地端口暴露给外界,那么您就犯了一个巨大的错误。
2021-03-16 13:23:01
谢谢伍迪,但你知道什么更好的吗?每次都需要吃午饭。我想要一些只允许访问 file:/// 的后台被动扩展
2021-03-20 13:23:01
很好的解决方案,但我不确定它是否安全。据我所知,使用计算机作为服务器总是有风险的。
2021-03-24 13:23:01
伍迪:非常感谢!这种方法对我有帮助。我在 Windows 10 上运行本地 Tomcat + 本地 AWS S3 存储桶。现在我可以在实时 AWS 服务器和本地服务器之间切换。干杯。
2021-03-30 13:23:01
@Mohammad_Hosein 不幸的是,我不知道有更简单的 chrome 插件。许多学生使用 EasyPHP Dev easyphp.org还有 lite-server 用于更倾向于技术的github.com/johnpapa/lite-server | freecodecamp.org/news/...
2021-04-02 13:23:01

1)打开你的终端并输入

npm install -g http-server

2)转到您要为您提供文件的根文件夹并键入:

http-server ./

3)阅读终端的输出,http://localhost:8080会出现一些东西

那里的一切都将被允许获得。例子:

background: url('http://localhost:8080/waw.png');

http-server 现在有一个导致错误的问题 - 你可以将它降级到 0.9 来修复 - 请参阅stackoverflow.com/questions/56364464/...
2021-03-25 13:23:01
这对我来说是最简单的答案。工作 100%。谢谢!
2021-04-06 13:23:01

好的,伙计们,我完全理解此错误消息背后的安全原因,但有时,我们确实需要一种解决方法......这是我的。它使用 ASP.Net(而不是这个问题所基于的 JavaScript),但它希望对某人有用。

我们的内部应用程序有一个网页,用户可以在其中创建一个快捷方式列表,指向遍布我们网络的有用文件。当他们点击这些快捷方式之一时,我们想要打开这些文件……但当然,Chrome 的错误阻止了这一点。

在此处输入图片说明

本网页使用 AngularJS 1.x 来列出各种快捷方式。

最初,我的网页试图直接创建一个<a href..>指向文件元素,但是Not allowed to load local resource当用户单击这些链接之一时,这会产生“ ”错误。

<div ng-repeat='sc in listOfShortcuts' id="{{sc.ShtCut_ID}}" class="cssOneShortcutRecord" >
    <div class="cssShortcutIcon">
        <img ng-src="{{ GetIconName(sc.ShtCut_PathFilename); }}">
    </div>
    <div class="cssShortcutName">
        <a ng-href="{{ sc.ShtCut_PathFilename }}" ng-attr-title="{{sc.ShtCut_Tooltip}}" target="_blank" >{{ sc.ShtCut_Name }}</a>
    </div>
</div>

解决方案是<a href..>用这段代码替换这些元素,在我的 Angular 控制器中调用一个函数......

<div ng-click="OpenAnExternalFile(sc.ShtCut_PathFilename);" >
    {{ sc.ShtCut_Name }}
</div>

功能本身很简单...

$scope.OpenAnExternalFile = function (filename) {
    //
    //  Open an external file (i.e. a file which ISN'T in our IIS folder)
    //  To do this, we get an ASP.Net Handler to manually load the file, 
    //  then return it's contents in a Response.
    //
    var URL = '/Handlers/DownloadExternalFile.ashx?filename=' + encodeURIComponent(filename);
    window.open(URL);
}

在我的 ASP.Net 项目中,我添加了一个名为的 Handler 文件DownloadExternalFile.aspx,其中包含以下代码:

namespace MikesProject.Handlers
{
    /// <summary>
    /// Summary description for DownloadExternalFile
    /// </summary>
    public class DownloadExternalFile : IHttpHandler
    {
        //  We can't directly open a network file using Javascript, eg
        //      window.open("\\SomeNetworkPath\ExcelFile\MikesExcelFile.xls");
        //
        //  Instead, we need to get Javascript to call this groovy helper class which loads such a file, then sends it to the stream.  
        //      window.open("/Handlers/DownloadExternalFile.ashx?filename=//SomeNetworkPath/ExcelFile/MikesExcelFile.xls");
        //
        public void ProcessRequest(HttpContext context)
        {
            string pathAndFilename = context.Request["filename"];               //  eg  "\\SomeNetworkPath\ExcelFile\MikesExcelFile.xls"
            string filename = System.IO.Path.GetFileName(pathAndFilename);      //  eg  "MikesExcelFile.xls"

            context.Response.ClearContent();

            WebClient webClient = new WebClient();
            using (Stream stream = webClient.OpenRead(pathAndFilename))
            {
                // Process image...
                byte[] data1 = new byte[stream.Length];
                stream.Read(data1, 0, data1.Length);

                context.Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", filename));
                context.Response.BinaryWrite(data1);

                context.Response.Flush();
                context.Response.SuppressContent = true;
                context.ApplicationInstance.CompleteRequest();
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

就是这样。

现在,当用户单击我的快捷方式链接之一时,它会调用该OpenAnExternalFile函数,该函数会打开这个 .ashx 文件,并将我们要打开的文件的路径+文件名传递给它。

此处理程序代码加载文件,然后在 HTTP 响应中将其内容传回。

并且,工作完成,网页打开外部文件。

呼!同样 - Chrome 抛出这个“ Not allowed to load local resources”异常是有原因的,所以要小心处理这个……但我发布这段代码只是为了证明这是绕过这个限制的一种相当简单的方法。

最后一个评论:原来的问题是想打开文件“ C:\002.jpg”。不能这样做。您的网站将位于一台服务器上(使用它自己的 C: 驱动器)并且无法直接访问您用户自己的 C: 驱动器。所以你能做的最好的事情就是使用像我这样的代码来访问网络驱动器上某处的文件。

如果我们不使用 angular 是否还有可能?
2021-03-15 13:23:01
为什么要使用网络客户端打开本地文件?对我来说,它尝试打开 C:\SomeNetworkPath\...
2021-03-16 13:23:01
听起来不错,但是您如何处理授权(读取权限)?如果不是所有用户都被允许查看给定文件怎么办?您不需要以请求用户的名义执行读取吗?
2021-03-21 13:23:01
这是一个有用的答案,但如果您通过这个 ashx 句柄像这样渲染和下载数百张图片,它将极大地影响网页的加载时间。
2021-03-25 13:23:01
@Marie - 感谢您的反馈。真的,从来没有人有礼貌地解释过为什么他们之前对我投反对票,所以我很感激。我同意,它确实为 Chrome 的安全性提供了一个后门,但在我公司的内部应用程序中,这个解决方案是必需的,并且是一个救星。但是,是的,正如我所说的……小心行事!
2021-04-04 13:23:01

出于安全原因,Chrome 专门以这种方式阻止本地文件访问。

这是一篇解决 Chrome 中的标志的文章(并打开您的系统以应对漏洞):

http://www.chrome-allow-file-access-from-file.com/

在 GoogleChrome 66 上它不起作用。Chrome 以该标志开头,但仍显示无法打开本地文件。
2021-03-15 13:23:01
请编辑答案。它不再工作了。
2021-03-15 13:23:01
我试图按照解决方案 "c:\path\chrome.exe" -allow-file-access-from-files 但我无法打开它。请测试这个网站fiddle.jshell.net/q326vLya/3我究竟做错了什么?
2021-04-04 13:23:01

有一个使用Web Server for Chrome的解决方法
以下是步骤:

  1. 将扩展添加到 chrome。
  2. 选择文件夹(C:\images)并在所需端口上启动服务器。

现在轻松访问您的本地文件:

function run(){
   // 8887 is the port number you have launched your serve
   var URL = "http://127.0.0.1:8887/002.jpg";

   window.open(URL, null);

}
run();

PS:您可能需要从高级设置中选择 CORS Header 选项,以防您遇到任何跨源访问错误。

谢谢。但你知道什么吗?每次都需要吃午饭。我想要一些只允许访问 file:/// 的后台被动扩展
2021-03-18 13:23:01