Ладно, ребята, я полностью понимаю причины безопасности позади этого сообщения об ошибке, но иногда мы мне нужен обходной путь ... и вот мой. Он использует ASP.Net (а не JavaScript, на котором был основан этот вопрос), но он, надеюсь, будет полезен кому-то.
Наше собственное приложение имеет веб-страницу, где пользователи могут создавать список ярлыков для полезных файлов, распространяемых по всей нашей сети. Когда они нажимают на один из этих ярлыков, мы хотим открыть эти файлы ... но, конечно, ошибка Chrome мешает этому.
Этот сайт использует AngularJS 1.x перечислить различные ярлыки.
Первоначально моя веб-страница пыталась напрямую создать элемент <a href..>
, указывающий на файлы, но это вызвало ошибку «Not allowed to load local resource
», когда пользователь нажал на одну из этих ссылок.
<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 href..>
элементов с этим кодом, чтобы вызвать функцию в моем угловом контроллере ...
<div ng-click="OpenAnExternalFile(sc.ShtCut_PathFilename);" >
{{ sc.ShtCut_Name }}
</div>
Сама функция очень проста ...
$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.Чистый проект, я добавил файл Handler под названием DownloadExternalFile.aspx
, который содержал этот код:
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;
}
}
}
И это все.
Теперь, когда пользователь нажимает на одну из моих ссылок ярлыка, он вызывает функцию OpenAnExternalFile
, которая открывает этот .ashx-файл, передавая ему путь + имя файла файла, который мы хотим открыть.
Этот код обработчика загружает файл, а затем передает его содержимое в ответ HTTP.
И, выполняемая работа, веб-страница открывает внешний файл.
Фу! Опять же - есть причина, по которой Chrome выбрасывает это исключение «Not allowed to load local resources
», поэтому тщательно проделайте это с этим ... но я отправляю этот код только для того, чтобы продемонстрировать, что это довольно простой способ обойти это ограничение.
Только один последний комментарий: оригинальный вопрос хотел открыть файл «C:\002.jpg
». Вы не можете сделать это. Ваш сайт будет размещаться на одном сервере (с собственным C: -диском) и не имеет прямого доступа к собственному C-диску вашего пользователя. Поэтому лучше всего использовать код, например my, для доступа к файлам где-то на сетевом диске.
использовать '<входной тип = файл>', чтобы получить доступ к местному reources – dandavis