好的,我完全理解了此错误消息背后的安全原因,但有时,我们确实需要解决方法……这是我的。 它使用ASP.Net(而不是此问题所基于的JavaScript),但希望对某些人有用。
我们内部的应用程序有一个网页,用户可以在其中创建指向遍布我们网络的有用文件的快捷方式列表。 当他们单击这些快捷方式之一时,我们想打开这些文件...但是,当然,Chrome的错误阻止了此操作。
该网页使用AngularJS 1.x列出了各种快捷方式。
最初,我的网页试图直接创建一个指向文件的元素,但是当用户单击这些链接之一时,这会产生“ C:\002.jpg”错误。
{{ sc.ShtCut_Name }}
解决方案是用此代码替换那些C:\002.jpg元素,以在我的Angular控制器中调用一个函数...
{{ sc.ShtCut_Name }}
函数本身非常简单...
$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项目中,我添加了一个名为C:\002.jpg的处理程序文件,其中包含以下代码:
namespace MikesProject.Handlers
{
///
/// Summary description for DownloadExternalFile
///
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;
}
}
}
就是这样。
现在,当用户单击我的快捷方式链接之一时,它将调用C:\002.jpg函数,该函数将打开此.ashx文件,并向其传递我们要打开的文件的路径+文件名。
此处理程序代码加载文件,然后将其内容传递回HTTP响应中。
并且,完成工作后,该网页将打开外部文件。
ew! 再一次-Chrome抛出此“ C:\002.jpg”异常是有原因的,因此请谨慎行事...但是我发布此代码只是为了证明这是解决此限制的一种非常简单的方法。
最后一个评论:最初的问题是要打开文件“ C:\002.jpg”。 你做不到 您的网站将位于一台服务器上(具有自己的C:驱动器),并且不能直接访问用户自己的C:驱动器。 因此,您能做的最好的事情就是使用像我的代码来访问网络驱动器上某处的文件。