Ok pessoal, eu entendo completamente os motivos de segurança por trás dessa mensagem de erro, mas às vezes, precisamos de uma solução alternativa ... e aqui está a minha. Ele usa ASP.Net (em vez de JavaScript, no qual esta pergunta foi baseada), mas espero que seja útil para alguém.
Nosso aplicativo interno tem uma página da web onde os usuários podem criar uma lista de atalhos para arquivos úteis espalhados por nossa rede. Quando eles clicam em um desses atalhos, queremos abrir esses arquivos ... mas é claro, o erro do Chrome impede isso.
Esta página da web usa AngularJS 1.x para listar os vários atalhos.
Originalmente, minha página da web estava tentando criar diretamente um <a href..>
elemento apontando para os arquivos, mas isso produziu o Not allowed to load local resource
erro " " quando um usuário clicou em um desses links.
<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 solução foi substituir esses <a href..>
elementos por este código, para chamar uma função no meu controlador Angular ...
<div ng-click="OpenAnExternalFile(sc.ShtCut_PathFilename);" >
{{ sc.ShtCut_Name }}
</div>
A função em si é muito simples ...
$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 em meu projeto ASP.Net, adicionei um arquivo Handler chamado DownloadExternalFile.aspx
que continha 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;
}
}
}
E é isso.
Agora, quando um usuário clica em um dos meus links de atalho, ele chama a OpenAnExternalFile
função, que abre esse arquivo .ashx, passando o caminho + nome do arquivo que queremos abrir.
Este código do manipulador carrega o arquivo e, em seguida, passa seu conteúdo de volta na resposta HTTP.
E, trabalho feito, a página da Web abre o arquivo externo.
Ufa! Novamente - há uma razão pela qual o Chrome lança essa Not allowed to load local resources
exceção " ", então tenha cuidado com isso ... mas estou postando este código apenas para demonstrar que esta é uma maneira bastante simples de contornar essa limitação.
Só um último comentário: a pergunta original queria abrir o arquivo " C:\002.jpg
". Você não pode fazer isso. Seu site ficará em um servidor (com sua própria unidade C:) e não terá acesso direto à unidade C: do seu usuário. Portanto, o melhor que você pode fazer é usar um código como o meu para acessar arquivos em algum lugar em uma unidade de rede.
<input type=file>
para obter acesso a recursos locais