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

新手上路,请多包涵

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

我想用经典的 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>")


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

错误

原文由 Benny Niemeijer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

不允许加载本地资源

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

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

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

在 Chrome 中 (参见 https://stackoverflow.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
%>

此示例是伪编码的,因此未经测试。

然后可以在 <a> 中使用这个脚本来返回资源;

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

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


有用的链接

原文由 user692942 发布,翻译遵循 CC BY-SA 4.0 许可协议

按照以下步骤,

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

原文由 Saba Mulla 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题