К сожалению, сделать это «в лоб» не получится. Во-первых, браузеры умеют открывать только веб-страницы, а не программы на компьютере. Во-вторых, политика безопасности браузеров запрещает доступ ко всему, что явно не разрешено, тем более, доступ к файловой системе.
Вы можете резонно предположить, что есть протокол file:// (я позволю себе использовать здесь и далее слово протокол, хотя правильнее, конечно, схема URI), который позволяет браузерам открывать локальные файлы, но с ним также есть две проблемы:
1) он не может отобразить список файлов в папке;
2) такие ссылки нельзя открывать с внешних (не локальных) веб-страниц.
Чтобы решить данную проблему, мы будем использовать свой протокол с собственным обработчиком. Метод будет работать в Windows и потребует некоторых (очень простых) действий на компьютере.
В HTML-коде это будет выглядеть как-то так:
<a href="myproto://C:/My Folder/123">открыть папку</a>
Можно из JavaScript:
window.open('myproto://C:/My Folder/123');
Сначала необходимо придумать название протокола (у меня будет myproto) и зарегистрировать его в системе. Для этого в любом месте (хоть на рабочем столе) создаём файл с расширением .reg (например, myproto.reg) и следующим содержимым:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\myproto]
"URL Protocol"=""
@="URL:Myproto Protocol"
[HKEY_CLASSES_ROOT\myproto\shell]
[HKEY_CLASSES_ROOT\myproto\shell\open]
[HKEY_CLASSES_ROOT\myproto\shell\open\command]
@="\"C:\\myproto.bat\" \"%1\""
Здесь myproto — название моего только что созданного протокола. Можете изменить на своё (но не используйте стандартные названия протоколов типа http, ftp, mailto и прочие).
Запускаем файл. Винда выдаст несколько вопросов и предупреждений, со всеми соглашаемся. Всё, больше этот файл на этом компьютере не нужен, можно удалять.
Далее в корне диска C: необходимо создать файл myproto.bat со следующим содержимым:
@echo off
set "path=%~1"
setlocal enabledelayedexpansion
set path=%path:myproto://=%
set path=%path:"=%
set path=%path:/=\%
set path=!path:%%20= !
set path=!path:%%5C=\!
C:\Windows\explorer.exe "%path%"
Здесь также меняем myproto на название вашего протокола. Это и будет его обработчик.
Всё готово. Теперь вы можете прямо из браузера (абсолютно любого) на данном компьютере открывать папки в проводнике в отдельном окне, просто открыв ссылку вида myproto://C:/My Folder/123.
К сожалению, данные действия придётся проделать на всех компьютерах, где необходима такая функциональность. Но, как правило, подобные вещи используются во внутрикорпоративных приложениях, где число пользователей известно и ограничено.
Комментарии (17)
LuchS-lynx
31.12.2022 12:23+2может слегка не по теме, но есть целая программка HFS которая осуществляет обмен расшаренными файлами через протокол http
Firsto
31.12.2022 14:51+4Ооо, с далёких нулевых пользовались для шаринга файлов в локальной сети
LuchS-lynx
31.12.2022 17:01ей можно шарить и через интернет по текущему активному внешнему ip твоего ПК
Firsto
31.12.2022 20:41Более того, там ещё аплоад можно разрешить, очень удобная фича - сам себе клауд сторадж: особенно круто на удалённом компе автоматом настроить скрипт по заданным правилам загружаемое например по папкам сортировать (перемещать/запускать/удалять, "вашедействие", и т.д.)
Myclass
31.12.2022 14:20+15Представьте, что у вас возникла необходимость прямо с веб-страницы заказа в вашей CRM-системе открывать папку с файлами, которые к этому заказу ототносятся
как такой дизайн процесса кому-то в голову может придти?! Сколько людей могут/будут работать с этим заказзом? А что если этот единственный человек, на диске которого лежат эти документы помрёт/полетит диск/забудет свой логин/ зайдёт через мобильное приложение и тд.? Как локальная папка может быть занесена в базу CRM? Даже, если это будет папка в лок.сети - боже избавь от такого архитектора.
vmkazakoff
31.12.2022 16:03+12Тот костыль, что вы изобрели - дичайщее пробитие дна и адищенская дырень в безопасности. Надеюсь что читатели вашей статьи дойдут до комментов и никогда не станут заниматься таким когнитивным онанизмом. А уж в корп.среде ваши ИБ обязаны были не только вас уволить, так ещё и физически сжечь все сервера и машины мимо которых вы могли ходить. Зная ваш протокол я буквально могу со своей страницы перебрать все файлы на вашем компе. Я уж молчу про .bat файл который вы можете запускать. Короче просто раззнайте это обратно, или хотя бы напишите наверху статьи капсом что так делать нельзя.
А вот как надо было: https://developer.mozilla.org/en-US/docs/Web/API/FileSystem
Уже давно есть готовое API для работы с файловой системой, с понятным ограничении доступа и внятными правами. Нормально поддерживается. Так работают различные системы для ведения заметок, из того что встречал. Они выполнены как онлайн сервис но хранят данные как файлы оффлайн, обычно в маркдауне.
excoder
31.12.2022 16:49-1Ну а что вы сразу продакшн. Я прикрутил к своей личной Докувики по этой инструкции, очень удобно, автору спасибо.
numb13
01.01.2023 06:05-1Автор, уберите пожалуйста этот cmd injection, чтобы неокрепшие умы не копипастили баг в свои CRM системы.
iliabvf
01.01.2023 13:32-1проще да, но безопаснее уже сделать electron-приложение, оно умеет открывать файлы и папки с диска, там можно и авторизацию и прочее добавить, и в Linux/MacOS
будет работать
Kenya-West
01.01.2023 22:39+2К сожалению, как разработчик, имеющий хотя бы отдалённые представления о безопасности, я обязан осудить решение в данной статье по следующим причинам:
Взаимодействие с локальной файловой системой из веб-сайта, который де-факто, де-юре, априори, по второму закону термодинамики и по здравому смыслу должен быть изолирован от ФС на клиентской машине. Взаимодействие происходит через протокол, который легко заабузить
Создание решений, запрещенных Женевской конвенцией: батник в корне C:\
Требование админских прав как преступление против
безопасниковчеловечности. Их ведь тупо может и не быть!-
Заведомый наброс на вентилятор (обсуждаемо, будет решено на Гаагском трибунале). Слишком толсто, попробуйте потоньше
Прошу всех, у кого глаза не вытекли кровью после прочтения статьи, не повторять описанные ими шаги ни в кровавом энтерпрайзе, ни в стартапе, ни клиентам на галере, даже если менеджер это одобрит! Только на собственной локальной машине (если IQ ниже 50), на виртуальной машине или песочнице (Windows Sandbox).
serafims
02.01.2023 02:37+2Задача, на самом деле, интересная. Например, я рабочих целей тоже начал разработку маленькой программки, которая вызывается ОС для обработки протокола, при этом после начала схемы идет идентификатор корневой папки. К примеру, при вызове
myproto://YDISK/Хрень по работе\Гемор\Тупые клиенты\Неплательщики\охреневшие\Уважаемый Сергей Анатольевич.doc
программа знает заранее, какая корневая папка задана для YDISK, и открывает соответствующий путь.
В контекстном меню проводника появляется дополнительный пункт типа "Скопировать путь для MyProtoViewer". Программа получает путь в параметр, анализирует, совпадает ли какая-то из нескольких корневых папок с началом пути, и формирует в буфер обмена ссылку видаmyproto://GDRIVE/Архив для маркетинга.zip
Это полезно для всяких диких CRM, которые неприспособлены нормально работать с файлами (даже битрикс с его аналогом яндекс диска оказался полной шляпой) в виде ссылок на файлы на ПК пользователя или на сервере в локалке.
В итоге, без предварительной настройки ПК нельзя просто так вызвать любой путь, с любыми параметрами.
OptimumOption
02.01.2023 09:47Не знаю почему, но напомнило старый анекдот:
"Здравствуйте, я молдавский вирус. По причине ужасной бедности моего создателя и низкого уровня развития технологий в нашей стране я не способен причинить какой-либо вред Вашему компьютеру. Поэтому очень прошу Вас, пожалуйста, сами сотрите какой-нибудь важный для Вас файл, а потом разошлите меня по почте другим адресатам. Заранее благодарю за понимание и сотрудничество"
tzlom
Это прям черная дыра безопасности
BigDflz
телеграм так же открывается. и ничего, не дыра.
tzlom
Телеграмм не передаёт произвольный экзешник в Эксплорер, попробуйте открыть исполняемый файл этой ссылкой. А если это URL ?
numb13
Есть много обработчиков протоколов. Но конкретно этот батник с дырой.