16.07.2008, 11:53 | #1 |
Участник
|
Документооборот
Добрый день!
Суть проблемы: Пользователи прикрепляют картинки к журналам, пользуясь стандартным документооборотом. На журналы наложен RLS, поэтому каждый пользователь видит только предназначенные для него журналы (подразумевается что и картинки он должен видеть только свои). При просмотре картинки (нажать кнопку "Открыть") картинка открывается стандартным просмотрщиком и далее кнопочками вправо-влево можно свободно "гулять" по каталогу файлов и смотреть все картинки (и свои и чужие). Собственно в этом и проблема. Как запретить пользователям при открытии просмотрщика картинки "гулять" по каталогу? Скажу сразу, что файлы бывают больше 5 МБ, поэтому на SQL сервере хранить их не получиться. Или получиться? Запретить просматривать картинки вне аксапты тоже нельзя, т.к. в самой аксапте уж слишком неудобно смотреть. Я вижу только одно решение - при нажатии кнопки "Открыть" копировать файл в какой-то временный каталог пользователя и открывать его уже там, а при закрытии просмотрщика удалять файл из временного каталога (Хотя как перехватить это событие? Это ведь закрытие окна уже вне аксапты ). Что посоветуете? |
|
16.07.2008, 13:41 | #2 |
Developer
|
У меня была отчасти схожая проблема. Необходимо было открывать в определенных случаях прикрепленные документы (хранимые в базе) так, что бы возможные изменения, производимые с документами, не записывались обратно в базу. Добавил новый пункт в енум DocuCode, добавил его обработку в DocuActionFile.run(), создал MenuItem с новым параметном енума DocuCode и там где было необходимо - кнопку с вызовом созданного MenuItem-а. Обработка нового пункта енума DocuCode такая же как и DocuCode::Open, только предварительно делается копия файла во временную папку.
В вашем случае можно в DocuActionFile.command() по некоторому критерию делать копию файла и изменять переменную filename. Только изменения. сделанные с этой копией все-равно подхватятся Аксаптой (файл скопируется в огигинальное хранилище), но это вас, как я понял, это не волнует. |
|
16.07.2008, 14:01 | #3 |
Участник
|
Это понятно... А как потом удалять эту копию?
|
|
16.07.2008, 14:11 | #4 |
Developer
|
можно использовать типа такого (кстати и обновляться в хранилище файлик не будет):
X++: DocuFileWatchDog::create(); DocuOpenFile::add(docuRef, fileName, false, // не обновлять файл в хранилище при освобождении true); // удалить файл при освобождении DocuFileWatchDog::createDelayed(); P.S. Ax3 Последний раз редактировалось vallys; 16.07.2008 в 14:56. |
|
|
За это сообщение автора поблагодарили: _scorp_ (1). |
16.07.2008, 14:29 | #5 |
Участник
|
Спасибо за идею, сейчас попробую. Тут еще самому идея пришла. Может допилить вставку файла так, чтобы при сохранении файл сохранялся не просто в каталог, укакзанный в настройках, а в
X++: docuType.ArchivePath\DocuValue.FileName\strfmt("%1.%2", DocuValue.FileName, DocuValue.FileType) |
|
16.07.2008, 14:47 | #6 |
Участник
|
Но проблему это решит только отчасти, т.к. через просмотрщик картинок пользователь используя кнопки вправо-влево не сможет "гулять" по каталогу, а вот через эксплорер сможет. Насколько я понимаю Аксапта создает файл в каталоге от имени пользователя, запустившего аксапту. Значит у пользователя должны быть права как на запись, так и на чтение этого каталога. Получается, что если пользователь захочет, то он зайдет в этот каталог обычным проводником и посмотрит все что нужно. Тупик?
|
|
16.07.2008, 14:50 | #7 |
Участник
|
Для начала стоит определить версию аксапты, для которой ищем решение
Решения я не знаю. Может стоит посмотреть в этом направлении: как-то надо заставить писать и читать файл от имени пользователя, который запустил AOS. |
|
|
За это сообщение автора поблагодарили: _scorp_ (1). |
16.07.2008, 14:52 | #8 |
Участник
|
Спасибо, совсем забыл, Ax4 SP2.
|
|
16.07.2008, 15:11 | #9 |
Developer
|
Цитата:
Цитата:
Сообщение от _scorp_
Но проблему это решит только отчасти, т.к. через просмотрщик картинок пользователь используя кнопки вправо-влево не сможет "гулять" по каталогу, а вот через эксплорер сможет. Насколько я понимаю Аксапта создает файл в каталоге от имени пользователя, запустившего аксапту. Значит у пользователя должны быть права как на запись, так и на чтение этого каталога. Получается, что если пользователь захочет, то он зайдет в этот каталог обычным проводником и посмотрит все что нужно. Тупик?
1. Дать доступ к сетевой папке только пользователю, под которым запускается AOS 2. Открывать файлы (т.е. подправить код открытия файлов в DocuActionFile.command()) с docuType.filePlace == DocuFilePlace:: Archive так же как и файлы с docuType.filePlace == DocuFilePlace:: Database, только создавать/копировать временный файл на стороне сервера (т.е. использовать приставку server). 3. Открывать файлы в режиме "ридонли" (см. выше), иначе DocuFileWatchDog потом попробует записать файлик в сетевую папку от имени локального пользователя. Ну или переделать DocuFileWatchDog Вроде все. P.S. Это я про тройку. Не знаю на сколько другой документооборот в четверке... |
|