Ok gente, capisco perfettamente i motivi di sicurezza dietro questo messaggio di errore, ma a volte abbiamo bisogno di una soluzione alternativa ... ed ecco la mia. Utilizza ASP.Net (piuttosto che JavaScript, su cui si basava questa domanda) ma si spera che possa essere utile a qualcuno.
La nostra app interna ha una pagina web in cui gli utenti possono creare un elenco di collegamenti a file utili sparsi in tutta la nostra rete. Quando fanno clic su una di queste scorciatoie, vogliamo aprire questi file ... ma ovviamente l'errore di Chrome lo impedisce.
Questa pagina web utilizza AngularJS 1.x per elencare le varie scorciatoie.
In origine, la mia pagina web stava tentando di creare direttamente un <a href..>
elemento che puntava ai file, ma questo produceva l' Not allowed to load local resource
errore " " quando un utente faceva clic su uno di questi link.
<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>
La soluzione era sostituire quegli <a href..>
elementi con questo codice, per chiamare una funzione nel mio controller Angular ...
<div ng-click="OpenAnExternalFile(sc.ShtCut_PathFilename);" >
{{ sc.ShtCut_Name }}
</div>
La funzione stessa è molto semplice ...
$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);
}
E nel mio progetto ASP.Net, ho aggiunto un file Handler chiamato DownloadExternalFile.aspx
che conteneva questo codice:
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;
}
}
}
E questo è tutto.
Ora, quando un utente fa clic su uno dei miei collegamenti di scelta rapida, chiama la OpenAnExternalFile
funzione, che apre questo file .ashx, passandogli il percorso + il nome del file che vogliamo aprire.
Questo codice gestore carica il file, quindi ritrasmette il contenuto nella risposta HTTP.
E, fatto il lavoro, la pagina web apre il file esterno.
Phew! Ancora una volta, c'è una ragione per cui Chrome lancia questa " Not allowed to load local resources
" eccezione, quindi procedi con cautela ... ma sto postando questo codice solo per dimostrare che questo è un modo abbastanza semplice per aggirare questa limitazione.
Solo un ultimo commento: la domanda originale voleva aprire il file " C:\002.jpg
". Non puoi farlo. Il tuo sito web risiederà su un server (con la propria unità C:) e non ha accesso diretto all'unità C: dell'utente. Quindi il meglio che puoi fare è usare un codice come il mio per accedere ai file da qualche parte su un'unità di rete.
<input type=file>
per accedere alle risorse locali