好的,伙计们,我完全理解此错误消息背后的安全原因,但有时,我们确实需要解决方法......这是我的。它使用 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) {
var URL = '/Handlers/DownloadExternalFile.ashx?filename=' + encodeURIComponent(filename);
window.open(URL);
}
在我的 ASP.Net 项目中,我添加了一个名为的处理程序文件,DownloadExternalFile.aspx
其中包含以下代码:
namespace MikesProject.Handlers
{
public class DownloadExternalFile : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string pathAndFilename = context.Request["filename"];
string filename = System.IO.Path.GetFileName(pathAndFilename);
context.Response.ClearContent();
WebClient webClient = new WebClient();
using (Stream stream = webClient.OpenRead(pathAndFilename))
{
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: 驱动器。因此,您能做的最好的事情就是使用像我这样的代码来访问网络驱动器上某处的文件。
<input type=file>
访问本地资源