Добре, люди, я повністю розумію причини безпеки цього повідомлення про помилку, але іноді нам потрібен обхідний шлях ... і ось мій. Він використовує 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..>
елементи цим кодом, викликати функцію в моєму контролері Angular ...
<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.Net я додав файл-обробник, який називається 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:. Тож найкраще, що ви можете зробити, - це використовувати такий код, як мій, для доступу до файлів десь на мережевому диску.
<input type=file>
для отримання доступу до місцевих джерел