Хорошо, ребята, я полностью понимаю причины безопасности этого сообщения об ошибке, но иногда нам нужен обходной путь ... и вот мой. Он использует 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) {
var URL = '/Handlers/DownloadExternalFile.ashx?filename=' + encodeURIComponent(filename);
window.open(URL);
}
И в моем проекте ASP.Net я добавил файл Handler, DownloadExternalFile.aspx
который содержал этот код:
namespace MikesProject.Handlers
{
public class DownloadExternalFile : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
string pathAndFilename = context.Request["filename"];
string filename = System.IO.Path.GetFileName(pathAndFilename);
context.Response.ClearContent();
WebClient webClient = new WebClient();
using (Stream stream = webClient.OpenRead(pathAndFilename))
{
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>
для доступа к местным