Как я могу создать ссылку на локальный файл на локальной веб-странице?

156

Я хотел бы иметь HTML-файл, который организует определенные файлы, разбросанные по всему моему жесткому диску. Например, у меня есть два файла, на которые я бы ссылался:

  • C:\Programs\sort.mw
  • C:\Videos\lecture.mp4

Проблема в том, что я хотел бы, чтобы ссылки функционировали как ярлык для файла. Я пробовал следующее:

<a href="C:\Programs\sort.mw">Link 1</a>
<a href="C:\Videos\lecture.mp4">Link 2</a>

... но первая ссылка ничего не делает, а вторая ссылка открывает файл в Chrome, а не в VLC.

Мои вопросы:

  1. Есть ли способ настроить мой HTML так, чтобы ссылки были ссылками на файлы?

  2. Если нет способа настроить HTML, есть ли другие способы аккуратной ссылки на файлы, разбросанные по всему жесткому диску?

Мой компьютер работает под управлением Windows 7, а мой веб-браузер - Chrome.

Брайан Фицпатрик
источник

Ответы:

259

Вам нужно использовать file:///протокол (да, это три слеша), если вы хотите ссылаться на локальные файлы.

<a href="file:///C:\Programs\sort.mw">Link 1</a>
<a href="file:///C:\Videos\lecture.mp4">Link 2</a>

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

Современные версии многих браузеров (например, Firefox и Chrome) откажутся от перехода с протокола http на файловый протокол для предотвращения злонамеренного поведения. Вам нужно будет открыть свою веб-страницу локально, используя файловый протокол, если вы хотите сделать это вообще.

Почему он застревает без file:///?

Первая часть URL - это протокол. Протокол состоит из нескольких букв, затем двоеточия и двух слешей. HTTP://и FTP://являются действительными протоколами; C:/нет, и я уверен, что он даже не похож на него.

C:/также не является действительным веб-адресом. Браузер может предположить, что он http://c/задан с пустым портом, но это не удастся.

Ваш браузер может не предполагать, что он ссылается на локальный файл. У него мало оснований для такого предположения, потому что публичные сайты обычно не пытаются ссылаться на локальные файлы людей.

Поэтому, если вы хотите получить доступ к локальным файлам: скажите ему использовать протокол файла.

Почему три слеша?

Потому что это часть схемы File URI . У вас есть возможность указать хост после первых двух слэшей. Если вы пропустите указание хоста, он просто будет предполагать, что вы ссылаетесь на файл на вашем собственном ПК. Это означает file:///C:/etc, что ярлык для file://localhost/C:/etc.

Эти файлы будут по-прежнему открываться в вашем браузере, и это хорошо

Ваш браузер будет реагировать на эти файлы так же, как они реагируют на один и тот же файл в любом месте в Интернете. Эти файлы не будут открываться в вашем стандартном обработчике файлов (например, MS Word или VLC Media Player), и вы не сможете ничего сделать, например, попросить проводника открыть файл.

Это очень хорошая вещь для вашей безопасности.

Сайты в вашем браузере не могут очень хорошо взаимодействовать с вашей операционной системой. Если хороший сайт может сказать вашей машине открыть lecture.mp4 в VLC.exe , вредоносный сайт может сказать ему, чтобы открыть virus.bat в CMD.exe . Или он может просто сказать вашей машине запустить несколько файлов Uninstall.exe или открыть File Explorer миллион раз.

Это может быть неудобно для вас, но HTML и безопасность браузера не были действительно разработаны для того, что вы делаете. Если вы хотите открыть файл lecture.mp4 в VLC.exe, попробуйте написать приложение для настольного компьютера.

doppelgreener
источник
1
Спасибо Джонатан. Вы знаете, есть ли способ «показать файл в папке» в качестве альтернативы?
Брайан Фитцпатрик
7
@Brian Ваш браузер не может взаимодействовать с вашей ОС таким образом, и вы должны быть очень рады, что он не может.
двойник
24
Похоже, что Chrome не будет загружать локальные файлы, используя протокол file: /// (что дает вам Not allowed to load local resourceошибку)
Loupax
1
Я хочу дать ссылку вроде этого "file: /// .. \ .. \ sort.mw", чтобы он возвращал две папки и получал файл там. Потому что мы используем слово файл в Dropbox. Так есть ли решение?
Муртаза Мунши
5
Также стоит упомянуть, что вы не можете ссылаться с веб-сайта (например, с локального сервера разработки) на локальный файл. forums.mozillazine.org/viewtopic.php?f=9&t=1730
Нуала
14

Если вы используете IIS на своем ПК, вы можете добавить каталог, к которому вы пытаетесь обратиться, как виртуальный каталог. Для этого щелкните правой кнопкой мыши свой сайт в МКС и нажмите «Добавить виртуальный каталог». Назовите виртуальную папку. Укажите виртуальную папку на папку на локальном ПК. Вы также должны предоставить учетные данные, которые имеют права доступа к определенной папке, например. HOSTNAME \ имя пользователя и пароль. После этого вы можете получить доступ к файлу в виртуальной папке, как и любой другой файл на вашем сайте.

http://sitename.com/virtual_folder_name/filename.fileextension

Кстати, это также работает с Chrome, который в противном случае не принимает файл протокола файла: //

Надеюсь, это поможет кому-то :)

user3507261
источник
Спасибо за ответ! Я положил file: /// перед путем к файлу, однако, когда я нажимаю на него, ничего не происходит. Я должен открыть его с помощью Ctrl (в новой вкладке). Почему это так?
Петр Цзы
5

Джанки в лучшем случае

<a href="file://///server/folders/x/x/filename.ext">right click </a></td>

и затем щелкните правой кнопкой мыши, выберите опцию «копировать местоположение», а затем вставьте в URL.

Чет Майнцер
источник
мы вынуждены щелкнуть правой кнопкой мыши? существует ли способ просто щелкнуть по нему левой кнопкой мыши?
Bandoleras
1

вернуться к 2017 году:

используйте URL.createObjectURL (файл), чтобы создать локальную ссылку на файловую систему, выбранную пользователем;

не забудьте освободить память с помощью URL.revokeObjectURL ()

мимон
источник
Аргумент file здесь требует фактического файлового объекта, созданного в среде выполнения JS клиента браузера, что означает, что мы должны были бы уже загрузить его в клиент браузера (например, с помощью элемента управления формы загрузки файла). Созданный URL-адрес является URL-адресом BLOB-объекта для загрузки или ссылки на эту копию, хранящуюся в памяти во время выполнения JS клиента браузера. Это не поможет в создании ссылки на локальный файл; это ссылка на копию, хранящуюся в памяти (в противном случае она не будет вести себя иначе, когда мы попытаемся получить к ней доступ).
двойник
Именно то, что мне было нужно. Используйте File Input, чтобы выбрать файл, затем откройте его на вкладке, используя createObjectURL.
Тони Лугг
0

У меня есть способ и работа, как это:

<'a href="FOLDER_PATH" target="_explorer.exe">Link Text<'/a>
Маца
источник
Это не похоже на допустимое целевое значение, даже в Internet Explorer .
Doppelgreener
IE игнорирует (недопустимую) цель (выше). Следующее прекрасно работает с IE10, 11: <a href="C:/tmp"> Ссылка на tmp на диске C. </a>
primehunter
Это хорошо работает для меня, используя IE и путь к сетевому диску, например, «file: // servername / path \ to \ folder» вместо FOLDER_PATH. Если вы опустите 'target = "_ explorer.exe"', папка откроется в IE вместо explorer.exe и будет выглядеть как проводник.
JonP