好伙计,我完全理解这背后的错误信息安全方面的原因,但有些时候,我们确实需要解决方法......而这是我的。它使用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..>
元素,调用一个函数在我的角度控制器...
<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。网项目,我添加了包含此代码调用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:驱动器。所以你可以做的最好的就是使用我的代码来访问网络驱动器上某处的文件。
使用''来获取本地资源 – dandavis