Internet 浏览器中的文件 URL“不允许加载本地资源”

Posted

技术标签:

【中文标题】Internet 浏览器中的文件 URL“不允许加载本地资源”【英文标题】:File URL "Not allowed to load local resource" in the Internet Browser 【发布时间】:2016-04-26 09:16:15 【问题描述】:

我有一个重要的脑筋急转弯。

我想用经典的 ASP 打开一个文件。我正在使用各种变量,因为事情可能会改变,但结果是正确的。我知道这一点是因为我已经通过复制链接地址并将其放在我的 URL 中来测试结果。现在的问题是:如果我点击我的链接,它不会做任何事情。不是刷新,不是重定向。没有。有谁知道我做错了什么?

好的,这就是交易。我的文件并不总是本地的,这取决于我所处的环境。如果我复制粘贴我的网址的结果,它会下载。如果我单击我的 URL,它不会响应。有任何想法吗?浏览器问题? (虽然我已经测试了 5 个浏览器)还是别的什么?我真的被困在这里,互联网似乎不在我这边。

我有 3 个环境。这里下面的变量是为了使链接有效。我知道该链接有效,因为我已经通过复制对其进行了测试。是的,它确实以 file:/// 开头,是的,我确定链接是正确的。

这是我的代码行:

response.write("<td class='tab_kolom2'><a href='"&rootRs("pre_rootpad")&rootRs("rootpad_protocollen")&"\"&overzichtRs("Formuliernr")&"\Uitvoeringsoverzicht.xls' target='_blank' download>Click here</a></td>")

编辑:带有错误/链接结果的屏幕截图

【问题讨论】:

也许只是"_blank"而不是"_new window"作为目标? @Paul 试过了,也不行 并且您确定rootRsoverzichtRs 中有值? 请“查看源代码”您的输出并为我们粘贴输出行的 html,以便我们可以看到您记录集中的值。此外,您似乎正在使用 \backslashes\ 而不是 /forward/slashes/ @Rich 查看我更新的帖子以获取 HTML 输出。反斜杠或正斜杠无关紧要它们无论如何都可以工作。此外,当我将链接粘贴到过去的浏览器中时,它确实有效。只是链接失效了 【参考方案1】:

从您最初的问题中我没有意识到您正在本地计算机上打开文件,我以为您正在从 Web 服务器向客户端发送文件。

根据您的屏幕截图,尝试像这样格式化您的链接:

<a href="file:///C:/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">Klik hier</a>

(在不知道每个记录集变量的内容的情况下,我无法给你确切的 ASP 代码)

【讨论】:

不是链接不对,是没有回复。 @BennyNiemeijer 它“没有响应”,因为这是不对的,认真的人们在这里试图帮助你。老实说,我不知道他们为什么会对你表现出的态度感到烦恼。仅仅因为链接在浏览器之外为您工作并不意味着它在一个浏览器中有效。所有本地文件链接都必须以file:/// 开头,否则浏览器将无法理解它是本地文件资源。他们还可能会发现,如果使用默认配置值运行,某些浏览器可能会限制访问被归类为本地资源的内容。 我什至不知道我为什么要费心继续回答相同的(错误的)答案。我用 file:/// 尝试了一切,但没有尝试 5 种不同的浏览器。没有任何工作。如果这是曾经可以工作的东西(它可以在我工作的旧电脑上工作)但它不再适用了,那就这样吧。但我知道我的链接是正确的。时期。如果我多次说,我有点发脾气。没那么难理解吧? @BennyNiemeijer 实际上是的,我会告诉你原因。您继续谈论您尝试过的事情,但您没有在问题中表明这一点,直到您更新问题并展示您尝试过的内容,人们将继续对您的挫折提出相同的建议。您截取的屏幕截图显示了一个 &lt;a&gt; 指向 C:\.... 已多次声明将不起作用、更新问题或继续让人们第二次猜测您。【参考方案2】:

您必须提供可通过浏览器访问的文件链接,例如:

<a href="http://my.domain.com/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">

<a href="C:/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">

如果您直接向公众公开“Projecten”文件夹,那么您可能只需要提供这样的链接:

<a href="/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">

但请注意,您的文件可能会被搜索引擎索引,任何拥有此链接的人都可以访问,等等。

【讨论】:

它在本地机器上,变量在我的测试和生产环境(它们是inranet环境)上是不同的,并且只能由具有正确权限的人访问。测试和生产环境中的文件链接到文件所在的服务器(因此是 rootpad 变量) 只有你错过了问题的重点:我的链接是正确的,它只是没有响应。这是为什么呢? 以“C:/...”开头的链接无效,正如@Rich 在他的回答中所说,您可以将链接格式化为“file:///C:/... ",但这只能在你自己的机器上工作,因为 fi在我的机器上,没有 C: 驱动器。该链接必须指向可通过 IIS 访问的文件夹。类似的答案在这里:***.com/a/28170154/911635 您是否检查过任何其他链接是否有效,即它不是“浏览器”/样式/javascript 问题?【参考方案3】:

现在我们知道了实际的错误是什么,可以得出一个答案。

不允许加载本地资源

是 Chrome 和其他现代浏览器中内置的安全异常。措辞可能不同,但在某种程度上,它们都有安全例外来处理这种情况。

过去您可以覆盖某些设置或应用某些标志,例如

--disable-web-security --allow-file-access-from-files --allow-file-access

在 Chrome 中 (参见 https://***.com/a/22027002/692942)

它的存在是有原因的

尽管在这一点上值得指出,这些安全异常的存在是有充分理由的,试图规避它们并不是最好的主意。

还有一种方法

由于您已经可以访问 Classic ASP,因此您始终可以构建一个为基于网络的文件提供服务的中间页面。您可以使用ADODB.Stream 对象和Response.BinaryWrite() 方法的组合来执行此操作。这样做可确保您的网络文件位置永远不会暴露给客户端,并且由于脚本的灵活性,它可用于从多个位置和多种文件类型加载资源。

这是一个基本示例(“getfile.asp”):

<%
Option Explicit

Dim s, id, bin, file, filename, mime

id = Request.QueryString("id")

'id can be anything just use it as a key to identify the 
'file to return. It could be a simple Case statement like this
'or even pulled from a database.
Select Case id
Case "TESTFILE1"
  'The file, mime and filename can be built-up anyway they don't 
  'have to be hard coded.
  file = "\\server\share\Projecten\Protocollen\346\Uitvoeringsoverzicht.xls"     
  mime = "application/vnd.ms-excel"
  'Filename you want to display when downloading the resource.
  filename = "Uitvoeringsoverzicht.xls"

'Assuming other files 
Case ...
End Select

If Len(file & "") > 0 Then
  Set s = Server.CreateObject("ADODB.Stream")
  s.Type = adTypeBinary 'adTypeBinary = 1 See "Useful Links"
  Call s.Open()
  Call s.LoadFromFile(file)
  bin = s.Read()

  'Clean-up the stream and free memory
  Call s.Close()
  Set s = Nothing

  'Set content type header based on mime variable
  Response.ContentType = mime
  'Control how the content is returned using the 
  'Content-Disposition HTTP Header. Using "attachment" forces the resource
  'to prompt the client to download while "inline" allows the resource to
  'download and display in the client (useful for returning images
  'as the "src" of a <img> tag).
  Call Response.AddHeader("Content-Disposition", "attachment;filename=" & filename)
  Call Response.BinaryWrite(bin)
Else
  'Return a 404 if there's no file.
  Response.Status = "404 Not Found"
End If
%>

这个例子是伪编码的,因此未经测试。

然后可以像这样在&lt;a&gt;中使用这个脚本来返回资源;

<a href="/getfile.asp?id=TESTFILE1">Click Here</a>

可以进一步采用这种方法并考虑 (尤其是对于较大的文件) 使用 Response.IsConnected 以检查客户端是否仍然存在并使用 s.EOS 属性以检查在读取块时流结束。您还可以添加到查询字符串参数以设置是否希望文件返回内联或提示下载。


有用的链接

Using METADATA to Import DLL Constants - 如果您无法识别adTypeBinary,总是比硬编码1 更好。

Content-Disposition:What are the differences between “inline” and “attachment”? - 有关Content-Disposition 在客户端上的行为方式的有用信息。

【讨论】:

这可以解释为什么它可以在旧电脑上运行。谢谢! @BennyNiemeijer 上述方法适用于任何方法,因为它消除了暴露本地文件系统和网络路径的风险。服务器完成繁重的工作而不是客户端。只需确保运行 Classic ASP Web 应用程序的帐户具有适当的权限来访问您希望从中读取的文件位置。 谢谢,它成功了。现在唯一的问题是它以“getfile.xls”打开我可以更改名称吗? @BennyNiemeijer 是的,Content-Disposition HTTP 标头可以为您执行此操作,我将更新我的示例。 谢谢,工作正常。这个案子终于可以结案了,没有你的帮助是办不到的,非常感谢!【参考方案4】:

对于不喜欢修改 chrome 的安全选项的人,我们可以简单地从包含您的本地文件的目录中启动一个 python http 服务器:

python -m SimpleHTTPServer

对于 python 3:

python3 -m http.server

现在您可以直接从您的 js 代码或外部使用 http://127.0.0.1:8000/some_file.txt 访问任何本地文件

【讨论】:

Python 与经典 ASP 的问题有何关联?【参考方案5】:

您只需要将所有图像网络路径替换为 HTML 字符串中的字节字符串。首先,您需要 HtmlAgilityPack 将 Html 字符串转换为 Html 文档。 https://www.nuget.org/packages/HtmlAgilityPack

在下面找到将每个图像 src 网络路径(或本地路径)转换为字节串的代码。它肯定会在IE、chrome和firefox中显示所有带有网络路径(或本地路径)的图像。

字符串编码HtmlString = Emailmodel.DtEmailFields.Rows[0]["Body"].ToString();

        // Decode the encoded string.
        StringWriter myWriter = new StringWriter();
        HttpUtility.HtmlDecode(encodedHtmlString, myWriter);
        string DecodedHtmlString = myWriter.ToString();

        //find and replace each img src with byte string
         HtmlDocument document = new HtmlDocument();
         document.LoadHtml(DecodedHtmlString);
         document.DocumentNode.Descendants("img")
          .Where(e =>
        
            string src = e.GetAttributeValue("src", null) ?? "";
            return !string.IsNullOrEmpty(src);//&& src.StartsWith("data:image");
        )
        .ToList()
                    .ForEach(x =>
                    
                        string currentSrcValue = x.GetAttributeValue("src", null);                                
                        string filePath = Path.GetDirectoryName(currentSrcValue) + "\\";
                        string filename = Path.GetFileName(currentSrcValue);
                        string contenttype = "image/" + Path.GetExtension(filename).Replace(".", "");
                        FileStream fs = new FileStream(filePath + filename, FileMode.Open, FileAccess.Read);
                        BinaryReader br = new BinaryReader(fs);
                        Byte[] bytes = br.ReadBytes((Int32)fs.Length);
                        br.Close();
                        fs.Close();
                        x.SetAttributeValue("src", "data:" + contenttype + ";base64," + Convert.ToBase64String(bytes));                                
                    );

        string result = document.DocumentNode.OuterHtml;
        //Encode HTML string
        string myEncodedString = HttpUtility.HtmlEncode(result);

        Emailmodel.DtEmailFields.Rows[0]["Body"] = myEncodedString;

【讨论】:

这个问题是关于 Classic ASP 而不是 ASP.Net,它们是非常不同的技术。【参考方案6】:

按照以下步骤,

    npm install -g http-server,在angular项目中安装http-server。 转到需要访问的文件位置并打开cmd提示符,使用cmd http-server ./ 在浏览器中使用端口号访问任何路径(例如:120.0.0.1:8080) 4.现在在您的角度应用程序中使用路径“http://120.0.0.1:8080/filename” 对我来说效果很好

【讨论】:

以上是关于Internet 浏览器中的文件 URL“不允许加载本地资源”的主要内容,如果未能解决你的问题,请参考以下文章

URL编程

网络编程

如何将文件接收地址AS2 URL中的HTTP修改为HTTPS?

Java网络编程之URL网络编程

基于URL的高层次Java网络编程

怎样删除历史记录?