2016-08-17 6 views
18

Test браузер: версию Chrome: 52.0.2743.116Невозможно открыть локальный файл - Chrome: Не разрешается загружать локальный ресурс

Это простой Javascript, который должен открыть файл изображения с локального, как «C: \ 002.jpg '

function run(){ 

    var URL = "file:///C:\002.jpg"; 

    window.open(URL, null); 

} 
run(); 

Вот мой пример кода. https://fiddle.jshell.net/q326vLya/3/

Просьба привести любые подходящие предложения.

+0

использовать '<входной тип = файл>', чтобы получить доступ к местному reources – dandavis

ответ

9

Chrome специфически блокирует доступ к локальным файлам таким способом по соображениям безопасности.

Вот статья, чтобы обойти флаг в Chrome (и открыть свою систему до уязвимостей):

http://www.chrome-allow-file-access-from-file.com/

+3

Я попытался выполнить решение «c: \ path \ chrome.exe "-allow-file-access-from-files, но я не могу его открыть. Пожалуйста, проверьте этот сайт https://fiddle.jshell.net/q326vLya/3/. Что я делаю не так? – KBH

+1

Это не работает для меня, такая же точная ошибка – rgorr

+1

не работает ни для меня, ни для –

1

Если вы можете это сделать, это будет представлять собой серьезную проблему безопасности, так как вы можете получить доступ к своей файловой системе и потенциально воздействовать на доступные там данные ... К счастью, невозможно сделать то, что вы пытаетесь сделать.

Если вам нужны локальные ресурсы для доступа, вы можете попробовать запустить веб-сервер на своем компьютере, и в этом случае ваш метод будет работать. Возможны и другие обходные пути, например, действие в настройках Chrome, но я всегда предпочитаю чистый способ, устанавливая локальный веб-сервер, возможно, на другом порту (нет, это не так сложно!).

Смотрите также:

+0

причина этого правила более социальная, чем техническая; браузеры делают хорошую работу по предотвращению программного доступа к ресурсам вне домена (например, SOP, CDN-скрипты, глубоко связанные IMG-теги и т. д.), но это заставляет людей игнорировать их локальное содержимое в окне браузера, даже если сценарий не может сказать, что он показывает ... – dandavis

+0

@ dandavis да, вы правы, все же я считаю, что может быть хорошо предотвратить это. Помимо ошибок в некоторых реализациях (если вы не можете открыть локальный ресурс, вы, вероятно, более безопасны), могут быть некоторые конкретные сценарии, когда другие люди смотрят на ваш экран (приложения для совместного использования экрана или просто за спиной в вашем офисе), и вы не хотите, чтобы ваши изображения (потенциально кредитная карта или личное изображение) можно было открыть, просто посетив некоторые веб-сайты, которые могут угадать местоположение в вашей локальной файловой системе ... – Prak

5

Ладно, ребята, я полностью понимаю причины безопасности позади этого сообщения об ошибке, но иногда мы мне нужен обходной путь ... и вот мой. Он использует ASP.Net (а не JavaScript, на котором был основан этот вопрос), но он, надеюсь, будет полезен кому-то.

Наше собственное приложение имеет веб-страницу, где пользователи могут создавать список ярлыков для полезных файлов, распространяемых по всей нашей сети. Когда они нажимают на один из этих ярлыков, мы хотим открыть эти файлы ... но, конечно, ошибка Chrome мешает этому.

enter image description here

Этот сайт использует 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, для доступа к файлам где-то на сетевом диске.

+0

спасибо..это решение экономит мое время. Простой и он работает. – Juniuz

+0

Отличное решение. Я искал для решения за недели – tarzanbappa

9

Знать это своего рода старый, но вижу много вопросов, как это ...

Мы используем Chrome много в классе, и это является обязательным условием для работы с локальными файлами.

Что мы использовали, это «Веб-сервер для Chrome». Вы запустите его, выберите папку, в которой хотите работать, и перейдите по URL-адресу (например, 127.0.0.1:порт, который вы выбрали)

Это простой сервер и не может использовать PHP, но для простой работы может быть вашим решением:

https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb

+0

Woody: спасибо большое! Этот подход помог мне. Я запускаю локальный Tomcat + локальный ковш AWS S3 в Windows 10. Теперь я могу переключаться между живым сервером AWS и локальным. – user1723453

1

Существует обходной путь, используя Web Server for Chrome.
Вот этапы:

  1. Добавить расширение на хром.
  2. Выберите папку (C: \ images) и запустите сервер на нужном порту.

Теперь легко получить доступ к локальному файлу:

function run(){ 
    // 8887 is the port number you have launched your serve 
    var URL = "http://127.0.0.1:8887/002.jpg"; 

    window.open(URL, null); 

} 
run(); 

PS: Вы, возможно, потребуется выбрать опцию CORS заголовка из дополнительных настроек упаковывают вы сталкиваетесь с какой-либо ошибки любой перекрестной ошибки доступа происхождения.

Смежные вопросы