De acuerdo amigos, entiendo completamente las razones de seguridad detrás de este mensaje de error, pero a veces, necesitamos una solución ... y aquí está la mía. Utiliza ASP.Net (en lugar de JavaScript, en el que se basó esta pregunta) pero es de esperar que sea útil para alguien.
Nuestra aplicación interna tiene una página web donde los usuarios pueden crear una lista de accesos directos a archivos útiles distribuidos por toda nuestra red. Cuando hacen clic en uno de estos accesos directos, queremos abrir estos archivos ... pero, por supuesto, el error de Chrome lo impide.
Esta página web utiliza AngularJS 1.x para enumerar los distintos accesos directos.
Originalmente, mi página web intentaba crear directamente un <a href..>
elemento apuntando a los archivos, pero esto producía el Not allowed to load local resource
error " " cuando un usuario hacía clic en uno de estos enlaces.
<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 solución fue reemplazar esos <a href..>
elementos con este código, para llamar a una función en mi controlador Angular ...
<div ng-click="OpenAnExternalFile(sc.ShtCut_PathFilename);" >
{{ sc.ShtCut_Name }}
</div>
La función en sí es muy simple ...
$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);
}
Y en mi proyecto ASP.Net, agregué un archivo Handler llamado DownloadExternalFile.aspx
que contenía este código:
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;
}
}
}
Y eso es.
Ahora, cuando un usuario hace clic en uno de mis enlaces de acceso directo, llama a la OpenAnExternalFile
función, que abre este archivo .ashx, pasándole la ruta + nombre de archivo del archivo que queremos abrir.
Este código del controlador carga el archivo y luego devuelve su contenido en la respuesta HTTP.
Y, trabajo hecho, la página web abre el archivo externo.
¡Uf! Nuevamente, hay una razón por la que Chrome lanza esta " Not allowed to load local resources
" excepción, así que tenga cuidado con esto ... pero estoy publicando este código solo para demostrar que esta es una forma bastante simple de evitar esta limitación.
Solo un último comentario: la pregunta original quería abrir el archivo " C:\002.jpg
". No puedes hacer esto. Su sitio web se ubicará en un servidor (con su propia unidad C:) y no tendrá acceso directo a la unidad C: de su usuario. Entonces, lo mejor que puede hacer es usar un código como el mío para acceder a archivos en algún lugar de una unidad de red.
<input type=file>
para obtener acceso a recursos locales