Okay Leute, ich verstehe die Sicherheitsgründe für diese Fehlermeldung vollständig, aber manchmal brauchen wir eine Problemumgehung ... und hier ist meine. Es verwendet ASP.Net (anstelle von JavaScript, auf dem diese Frage basiert), aber es wird hoffentlich für jemanden nützlich sein.
Unsere interne App verfügt über eine Webseite, auf der Benutzer eine Liste mit Verknüpfungen zu nützlichen Dateien erstellen können, die über unser Netzwerk verteilt sind. Wenn sie auf eine dieser Verknüpfungen klicken, möchten wir diese Dateien öffnen ... aber natürlich verhindert der Chrome-Fehler dies.
Diese Webseite verwendet AngularJS 1.x, um die verschiedenen Verknüpfungen aufzulisten.
Ursprünglich versuchte meine Webseite, direkt ein <a href..>
Element zu erstellen , das auf die Dateien verweist. Dies führte jedoch zu dem Not allowed to load local resource
Fehler " ", wenn ein Benutzer auf einen dieser Links klickte.
<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>
Die Lösung bestand darin, diese <a href..>
Elemente durch diesen Code zu ersetzen und eine Funktion in meinem Angular-Controller aufzurufen ...
<div ng-click="OpenAnExternalFile(sc.ShtCut_PathFilename);" >
{{ sc.ShtCut_Name }}
</div>
Die Funktion selbst ist sehr einfach ...
$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);
}
Und in meinem ASP.Net-Projekt habe ich eine Handler-Datei namens aufgerufen, DownloadExternalFile.aspx
die diesen Code enthielt:
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;
}
}
}
Und das ist es.
Wenn ein Benutzer auf einen meiner Verknüpfungslinks klickt, ruft er die OpenAnExternalFile
Funktion auf, die diese .ashx-Datei öffnet und ihr den Pfad + Dateinamen der Datei übergibt, die wir öffnen möchten.
Dieser Handler-Code lädt die Datei und gibt ihren Inhalt in der HTTP-Antwort zurück.
Und wenn die Arbeit erledigt ist, öffnet die Webseite die externe Datei.
Puh! Wieder - es gibt einen Grund, warum Chrome diese " Not allowed to load local resources
" Ausnahme auslöst. Gehen Sie also vorsichtig damit um ... aber ich poste diesen Code nur, um zu demonstrieren, dass dies ein ziemlich einfacher Weg ist, um diese Einschränkung zu umgehen.
Nur ein letzter Kommentar: Die ursprüngliche Frage wollte die Datei " C:\002.jpg
" öffnen . Das kannst du nicht machen. Ihre Website befindet sich auf einem Server (mit eigenem Laufwerk C:) und hat keinen direkten Zugriff auf das eigene Laufwerk C: Ihres Benutzers. Das Beste, was Sie tun können, ist, Code wie meinen zu verwenden, um auf Dateien irgendwo auf einem Netzwerklaufwerk zuzugreifen.
<input type=file>
, um Zugriff auf lokale Ressourcen zu erhalten