Работа с гиперссылками в Linux

Автор st.inna, 15 июня 2023, 10:10

0 Пользователи и 1 гость просматривают эту тему.

st.inna

Всем здравствуйте!

Такая проблема:

Нужно открыть файл PDF через гиперссылку.

Если путь к файлу прописать как file:///mnt/.../<username>/.../Файл.pdf, то открываются файлы любого расширения (write, calc, PDF), но так как в пути к файлу есть <username>, то файл по такой гиперссылке может открыть только тот, кто вошел в сеть с этим юзернеймом, другие пользователи уже нет, хотя файл находится на сетевом общедоступном ресурсе.

Если путь к файлу прописать как smb://..., то открываются файлы только расширения write и calc (возможно откроются все расширения LibreOffice, не пробовала), но вот файлы PDF не открывает - открывается проводник с той папкой, в которой лежит PDF-файл, и сама папка типа пустая.

Есть ли возможность "обойти" <username> в пути к файлу?

mikekaganski

#1
Цитата: st.inna от 15 июня 2023, 10:10но так как в пути к файлу есть <username>, то файл по такой гиперссылке может открыть только тот, кто вошел в сеть с этим юзернеймом, другие пользователи уже нет, хотя файл находится на сетевом общедоступном ресурсе

Насколько я понимаю, проблема не в том, что "в пути к файлу есть <username>", а в том, что протокол file открывает только файлы, смонтированные на этой системе и доступные по этому пути; доступ определяется, в т.ч., разрешениями каждой директории.

Цитата: st.inna от 15 июня 2023, 10:10Если путь к файлу прописать как smb://..., то открываются файлы только расширения write и calc (возможно откроются все расширения LibreOffice, не пробовала), но вот файлы PDF не открывает

... и Вы, конечно, не забыли написать, какой версией ЛО Вы пользуетесь - например, чтобы определить, может ли это быть tdf#140886 ;)

Цитата: st.inna от 15 июня 2023, 10:10открывается проводник с той папкой, в которой лежит PDF-файл, и сама папка типа пустая

А вот это вообще непонятно. Если что-то вообще открывается, то я бы предположил, что у Вас неправильный URL (незакодированные пробелы в пути? как они были созданы?). Если открывшаяся папка правильная, но пустая - проверьте ваши настройки общего ресурса (не разрешено просматривать содержимое папок?). И "проводник" в Linux?
С уважением,
Михаил Каганский

bigor

Я так понимаю, что под <username> понимается домашняя папка пользователя, права на нее есть только у пользователя, поэтому только он и может работать с ней.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

#3
Цитата: bigor от 15 июня 2023, 15:07Я так понимаю, что под <username> понимается домашняя папка пользователя

Кмк, скорее это выделенная папка где-то на сервере, исходя из

Цитата: st.inna от 15 июня 2023, 10:10file:///mnt/.../<username>/.../Файл.pdf

где "/mnt/.../<username>" намекает на папку, отличную от home (хотя всё возможно).
Но главное -

Цитата: bigor от 15 июня 2023, 15:07права на нее есть только у пользователя, поэтому только он и может работать с ней

с чем я 100% согласен, и поэтому, опять же, дело не в имени папки, а в свойствах элементов пути. Создав простую папку с именем "<username>" где-то в доступном месте, тот же самый "<username>" не будет мешать.

Кстати, неужели в сети расшарены части внутри персональных папок пользователей, доступные по smb? Может быть, тут работает что-то ещё, скажем, автоматическое копирование определённых типов файлов из Вашей папки куда-то в другое место, а PDF не копируются? Вообще фантазировать на тему системного администрирования и магии вокруг него можно бесконечно...
С уважением,
Михаил Каганский

st.inna

Упс! Прошу прощения - версия LO 7.4.5.1/LibreOffice Community

Папка, в которой лежит открываемый PDF-файл, расположена на сетевом ресурсе предприятия и доступ к ней есть у каждого заинтересованного в этом файле пользователе.

адрес "home и далее", это если файл расположен непосредственно только на моем компьютере, и понятное дело его другие пользователи не увидят. Но файл, который находится в сети имеет путь mnt/.../<username>/.../Файл.pdf. Если другие пользователи могут из проводника его открывать, то дело точно не в правах на доступ к папке.
<username> - значение переменное, и не название папки. Это логин пользователя, который придя на работу и входя в компьютерную сеть предприятия, вводит работник для его идентификации в этой сети. Зашел Иванов - вместо <username> будет ivanov, зашел Петров - вместо <username> будет petrov (это пример). Поэтому, если я вхожу в сеть, то в пути к файлу вместо <username> будет sidirov (тоже пример). Если по мною созданной гиперссылке файл захотят открыть Иванов или Петров, то они не смогут этого сделать, т.к. путь к файлу содержит мой логин как пользователя. Обходной путь (без упоминания пользователя) - через smb, но там файлы с расширением PDF не открываются. Возможно, это тот указанный Вами,  mikekaganski, баг  :(

sokol92

Мы используем следующую (распространенную) схему работы с сетевыми ресурсами в сети, в которой есть компьютеры как Windows, так и Linux.
Для Windows используются сетевые драйвы, например N:\, O:\.
В Linux путь к этим же ресурсам такой: /home/<username>/net/N/, /home/<username>/net/O/
Действительно, "постоянные" гиперссылки обычным образом не сделать.
Но это вопрос к системным программистам. Попросите их монтировать соответствующим пользователям такие, например, ресурсы: /mnt/net/N/, /mnt/net/O/

Владимир.

mikekaganski

Цитата: st.inna от 15 июня 2023, 15:44LO 7.4.5.1
Цитата: st.inna от 15 июня 2023, 15:44Возможно, это тот указанный Вами,  mikekaganski, баг

Нет, тот баг исправлен уже в 7.4.0.
Вы не ответили ничего по вопросам, которые я задавал в #1 об smb: URL - как создаётся, нет ли пробелов, что за папка открывается, и что такое "проводник" в Linux.
Но если не с помощью SMB, то попробуйте смонтировать папку глубже <username>.
С уважением,
Михаил Каганский

bigor

Цитата: st.inna от 15 июня 2023, 15:44<username> - значение переменное, и не название папки
очень сильно сомневаюсь. Скорее всего переменная подставляется как имя папки в пути. 
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

bigor

Цитата: st.inna от 15 июня 2023, 15:44Обходной путь (без упоминания пользователя) - через smb, но там файлы с расширением PDF не открываются
Проверил, нормально открываются pdf файлы из самба папки
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

st.inna

Всем огромное спасибо за попытку помочь!

Справилась сама, как всегда без макроса не обошлось.

Отвечаю на предыдущие (некоторые) вопросы. В базе данных в конструкторе есть элемент "Выбор файла". Разместила его на форме моей БД. С помощью него попадаем в проводник, выбираем нужный нам файл, кнопка ОК - путь  файлу прописывается в поле таблицы (макрос говорит в какое поле). Путь к файлу "кодируется" автоматически, если в названии папок есть пробелы, то в пути так же видим эти пробелы. Получили гиперссылки. Теперь по этим гиперссылкам нужно открыть файл. Для этого на форме есть кнопка, на которую навешан макрос на событие "При получении фокуса", который отправляет тот путь к файлу, который прописан в поле таблицы, на которой сейчас находится курсор. В макросе предусмотрен ConvertToURL(путь к файлу).

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

Если я - пользователь Иванов, то путь к файлу такой (чисто для понимания):

mnt/Предприятие/ivanov/Подразделения/Бухгалтерия/Файл1.pdf

т.к. в пути к файлу есть сведения о пользователе (ivanov), то Петров и Сидоров уже этот файл по такой ссылке не откроют, потому что для них путь к этому файлу должен быть
mnt/Предприятие/petrov/Подразделения/Бухгалтерия/Файл1.pdf   и
mnt/Предприятие/sidorov/Подразделения/Бухгалтерия/Файл1.pdf  соответственно.

Чтобы избежать в пути к файлу этот несчастный <username>, написала макрос, который от пути к файлу отрезает вот эту часть: mnt/Предприятие/ivanov/, а в макросе на кнопке, который открывает выбранный в таблице файл прописала
oButton_Open_fajl.TargetUrl = ConvertToURL("mnt/Предприятие/" & CurrentUser & "/"& oForm.Columns.getByName("Документ").getString)

oForm.Columns.getByName("Документ").getString - это остаток пути к файлу, в приведенном примере это - "Подразделения/Бухгалтерия/Файл1.pdf",
oButton_Open_fajl - кнопка, открывающая файл по выбранному к нему пути.
CurrentUser - функция, определяющая текущего пользователя.

И теперь сама гиперссылка хранит только путь: "Подразделения/Бухгалтерия/Файл1.pdf", а при открытии файла дописывается начало пути к файлу с учетом текущего пользователя.

Программисты, конечно, могут сейчас мой способ  закидать шапками, но для меня важно, что теперь все работает как мне нужно. И я не программист, мне простительно  ;)

Но есть один недостаток: длина <username> у разных пользователей разная, и при обрезке первой части пути к файлу приходится прописывать условия, что "если пользователь такой, то отрезать столько, если пользователь другой, то отрезать столько". Благо, что пользователей, которые формируют такие гиперссылки не так много, но все же, хотелось бы более универсальный способ "обрезки". Есть ли такой способ "обрезать слева всё до третьего / включительно"?


mikekaganski

#10
Цитата: st.inna от 19 июня 2023, 09:32длина <username> у разных пользователей разная, и при обрезке первой части пути к файлу приходится прописывать условия

Самое простое - если Вы приведёте кусок кода, которым Вы обрезаете. Возможно, достаточно чего-то типа

myStart = "mnt/Предприятие/" & CurrentUser & "/"
myPath = Mid(myPath, Len(myStart))

Также может пригодиться функция DirectoryNameoutofPath из библиотеки tools (или её код для вдохновения).

Цитата: st.inna от 19 июня 2023, 09:32для них путь к этому файлу должен быть
mnt/Предприятие/petrov/Подразделения/Бухгалтерия/Файл1.pdf   и
mnt/Предприятие/sidorov/Подразделения/Бухгалтерия/Файл1.pdf  соответственно.

Очень интересная схема, неожиданная для меня. Обратите внимание, что это гораздо информативнее, и могло помочь нам помочь Вам гораздо лучше, если бы было описано с самого начала.
(Была б моя воля, я бы поувольнял сисадминов, придумавших такое. Одна общая папка с отдельными пользовательскими папками, внутри которых возможно индивидуальный набор доступных единообразных путей, вместо инивидуальных маунтов самих пользовательских папок, дающих полностью одинаковые пути...)
С уважением,
Михаил Каганский

st.inna

Отвечаю на: "Самое простое - если Вы приведёте кусок кода, которым Вы обрезаете" (не разобралась как цитировать написанное другим автором :-(

1. Часть кода по обрезке такая:

oFile = oForm.getByName("Vybor_fajla").Text      '(это текст полного пути к файлу, который автоматически определяется при выборе файла в проводнике. Если я - пользователь Иванов, то полный путь: mnt/Предприятие/ivanov/Подразделения/Бухгалтерия/Файл1.pdf)

If LEFT(oFile, 23) Like "/mnt/Предприятие/ivanov" Then
oFile_urezanny = RIGHT(oFile, LEN(oFile) - 23)      'получаем часть пути без упоминания пользователя, сформировавшего гиперссылку: "/Подразделения/Бухгалтерия/Файл1.pdf", и эта часть хранится в поле таблицы.

Else If LEFT(oFile, 23) Like "/mnt/Предприятие/petrov" Then
oFile_urezanny = RIGHT(oFile, LEN(oFile) - 23)

Else If LEFT(oFile, 24) Like "/mnt/Предприятие/sidirov" Then
oFile_urezanny = RIGHT(oFile, LEN(oFile) - 24)

End If
End If
End If

oPole_Document = oForm.Columns.getByName("Документ")   'поле, в котором теперь хранится обрезанная (правая) часть пути, т.е. "/Подразделения/Бухгалтерия/Файл1.pdf"
   
oPole_Document.Value = oFile_urezanny

2. Затем в другом макросе, посылающем URL-адрес файла кнопке, склеиваем нужные части, учитывая какой пользователь открывает эту гиперссылку:

oButton_Open_fajl.TargetUrl = ConvertToURL("/mnt/Предприятие/" & CurrentUser &  oForm.Columns.getByName("Документ").getString)    'работу этой строки описывала в предыдущем сообщении

3. Т.е. получается, что создавать ссылки могут разные пользователи, и затем открывать ссылки тоже разные пользователи.
Если ссылку формирует Иванов, то обрезать нужно "/mnt/Предприятие/ivanov", что составляет 23 символа.
Если ссылку формирует Петров, то обрезать нужно "/mnt/Предприятие/petrov", что составляет тоже 23 символа.
Если ссылку формирует Сидоров, то обрезать нужно "/mnt/Предприятие/sidorov", что составляет уже 24 символа.

В реальности пользователей может быть больше и длина каждого usernam может отличаться. Хотелось бы не считать эти символы и не прописывать условия для каждого пользователя, а обрезать всё, что находится до третьего по счету "/" включительно. Есть какая-то функция, которая определяла бы позицию третьего по счету встречающегося "/"?

mikekaganski

#12
Цитата: st.inna от 19 июня 2023, 11:36не разобралась как цитировать написанное другим автором

Выделить текст, который хотите процитировать, и нажмите кнопку "ЦИТИРОВАТЬ ВЫДЕЛЕННОЕ" (которая появляется под сообщением после "ЦИТИРОВАТЬ", когда есть выделение; у неё есть ошибка, когда Вы выделяете самый конец сообщения).

Цитата: st.inna от 19 июня 2023, 11:361. Часть кода по обрезке такая:

oFile = oForm.getByName("Vybor_fajla").Text      '(это текст полного пути к файлу, который автоматически определяется при выборе файла в проводнике. Если я - пользователь Иванов, то полный путь: mnt/Предприятие/ivanov/Подразделения/Бухгалтерия/Файл1.pdf)

If LEFT(oFile, 23) Like "/mnt/Предприятие/ivanov" Then
oFile_urezanny = RIGHT(oFile, LEN(oFile) - 23)      'получаем часть пути без упоминания пользователя, сформировавшего гиперссылку: "/Подразделения/Бухгалтерия/Файл1.pdf", и эта часть хранится в поле таблицы.

Если этот код выполняется от имени текущего пользователя (т.е. того, который выбирал файл в проводнике), то вот тут же можно сделать просто:

myStart = "/mnt/Предприятие/" & CurrentUser
If LEFT(oFile, Len(myStart)) = myStart Then
oFile_urezanny = MID(oFile, LEN(myStart))

Цитата: st.inna от 19 июня 2023, 11:36Есть какая-то функция, которая определяла бы позицию третьего по счету встречающегося "/"?

Используйте InStr три раза. Или Вам на самом деле надо четвёртый? А лучше - проверить, что текст начинается строго с "/mnt/Предприятие/", и тогда вызвать InStr с первым аргументом 18.
Кстати, почему Like? Ведь нестрогое равенство может привести к странным последствиям. Например, обрежется не то число символов.
С уважением,
Михаил Каганский

bigor

Я так понимаю из всего адреса нам нужно только имя файла, все остальное за исключением имени пользователя одинаковое. Выделяем имя файла (можно взять последнее значение split с разделителем /) приписываем к нему остальной путь с подставленным именем пользователя.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

st.inna

Цитата: mikekaganski от 19 июня 2023, 11:49А лучше - проверить, что текст начинается строго с "/mnt/Предприятие/", и тогда вызвать InStr с первым аргументом 18.

InStr с первым аргументом 18 - это то, что нужно!!!

теперь все работает как нужно и код "обрезки" универсальный:

oFile = oForm.getByName("Vybor_fajla").Text
iPos = InStr(18, oFile, "/")        '(для пользователя Иванов iPos будет 24, т.е. позиция 3-его по счету "/" в
                                    "/mnt/Предприятие/ivanov/....",
                                    для пользователя Сидоров iPos будет 25, т.е. позиция 3-его по счету "/" в
                                    "/mnt/Предприятие/sidorov/...." 

If LEFT(oFile, 17) = "/mnt/Предприятие/" Then        'Проверяем расположен ли файл на сетевом ресурсе
oFile_urezanny = RIGHT(oFile, LEN(oFile) - iPos)  
Else MsgBox "Можно вставить только файл," & Chr(10) & "расположенный на сетевом ресурсе!"
End If

Тогда в макросе вставки пути к файлу в кнопку открытия файла строка выглядит:
oButton_Open_fajl.TargetUrl = ConvertToURL("/mnt/Предприятие/" & CurrentUser & "/"& oForm.Columns.getByName("Документ").getString)

По сути oForm.Columns.getByName("Документ").getString это и есть переменная oFile_urezanny, но т.к. это уже другой макрос, то обращение такое.

Цитата: mikekaganski от 19 июня 2023, 09:48Была б моя воля, я бы поувольнял сисадминов, придумавших такое. Одна общая папка с отдельными пользовательскими папками, внутри которых возможно индивидуальный набор доступных единообразных путей, вместо инивидуальных маунтов самих пользовательских папок, дающих полностью одинаковые пути...

Вот приходится с таким работать...

Цитата: bigor от 19 июня 2023, 12:07Я так понимаю из всего адреса нам нужно только имя файла, все остальное за исключением имени пользователя одинаковое. Выделяем имя файла (можно взять последнее значение split с разделителем /) приписываем к нему остальной путь с подставленным именем пользователя
Цитата: bigor от 19 июня 2023, 12:07Я так понимаю из всего адреса нам нужно только имя файла, все остальное за исключением имени пользователя одинаковое. Выделяем имя файла (можно взять последнее значение split с разделителем /) приписываем к нему остальной путь с подставленным именем пользователя.

Немножко не так. Гиперссылку могут создавать разные пользователи, и из ими созданной гиперссылки нужно "вырезать" их имя. Затем эту гиперссылку могут открывать другие пользователи, и здесь нужно "вставить" имя того, кто ее открывает.

Всем большое спасибо за участие!!! Проблема для меня решена, и вопрос может быть закрыт.