Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Web-клиент и загрузка файлов. Траблы. (http://forums.kuban.ru/f1040/web-klient_i_zagruzka_fajlov_trably-8846203.html)

US1C 26.03.2019 15:00

Web-клиент и загрузка файлов. Траблы.
 
Приветствую коллеги!
Ситуевина. Есть самописная конфа, где есть функционал загрузки файлов в базу. В тонком клиенте все отрабатывает без проблем. Запускаю web-клиент и при попытке загрузить выбранный файл идет ошибка доступа к файлу.
[url]https://ibb.co/D1kgk1T[/url]
[url]https://ibb.co/MptqTDH[/url]

Не могу понять, где собака порылась?
И тонкий клиент и web-клиент работают под одной учеткой в ОС. Причем, при выборе из web-клиента, я хожу по каталогам, открываю, редактирую, сохраняю, удаляю файлы в диалоге выбора файла. Т.е. на это прав хватает, а скопировать его в базу - ошибка доступа.

Jimbo 27.03.2019 09:25

Это есть ?

В веб-клиенте работа с файлами (чтение/запись) производится только на сервере.

Функция ПодключитьРасширениеРаботыСФайлами() используется в веб-клиенте для включения разрешения работы с файлами (поддерживают не все браузеры), если неудачно – возвращает Ложь. Перед первым использованием функции в этом браузере на этом комьютере требуется установить расширение работы с файлами с помощью функции УстановитьРасширениеРаботыСФайлами()

US1C 27.03.2019 09:38

(1) Ну да. Установка и подключение прописаны. Иначе бы при попытке выбрать файл уже ругался бы на отсутствие расширения работы с файлами.

&НаКлиенте
Процедура ВыполнитьПодключение()

Оповещение = Новый ОписаниеОповещения("ВыполнитьПослеПодключения", ЭтотОбъект);
НачатьПодключениеРасширенияРаботыСФайлами(Оповещение);

КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьПослеПодключения(Подключено,ДополнительныеПараметры) Экспорт

Если НЕ Подключено Тогда
Оповещение = Новый ОписаниеОповещения("ВыполнитьПослеУстановки", ЭтотОбъект);
НачатьУстановкуРасширенияРаботыСФайлами(Оповещение);
КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьПослеУстановки(ДополнительныеПараметры) Экспорт

ВыполнитьПодключение();

КонецПроцедуры

Jimbo 27.03.2019 11:50

может файл огромный ? Более 1МБ, ковырять надо настройки и ограничения на Веб-сервере

US1C 27.03.2019 12:15

(3) Нет. Пробовал разные, в т.ч. маленькие (несколько кВ). Да и ошибка не про размер, а про доступ к файлу.
Причем попробовал на сервере, где SQL,1C,IIS крутятся, запустить браузер под локальным админом - та же хрень. Хотя прав при этом на все - до и бо.

user1C 27.03.2019 12:38

как вариант, в свойствах разрешений папки(в которой находится загружаемый файл) для группы пользователей IIS_IUSRS установить "полный доступ"

US1C 27.03.2019 13:52

(5) Сделал даже больше. Дал всем полные права на файл. Те же яйца, вид сбоку.

roma n 27.03.2019 14:25

"скопировать его в базу" с точки зрения кода и контекста его выполнения как организовано?

US1C 27.03.2019 15:26

(7) Код нехитрый. Но повторюсь, в тонком клиенте все отрабатывает на ура.

&НаСервере
Процедура ЗаписатьЭлемент(ПараметрыФайла)

Файл = Справочники.Файлы.СоздатьЭлемент();
Файл.Наименование = ПараметрыФайла.Имя;
Файл.ИмяФайла = ПараметрыФайла.ПолноеИмя;
Сжатие = Новый СжатиеДанных(1);
ХранилищеФайла = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(ПараметрыФайла.АдресФайлаВХранилище), Сжатие);
Файл.Хранилище = ХранилищеФайла;
Файл.Расширение = ПараметрыФайла.Расширение;
Файл.Размер = ПараметрыФайла.Размер/1024;
Файл.Записать();

КонецПроцедуры

&НаКлиенте
Процедура ВыбратьФайл(Команда)

ОповещениеОЗавершении = Новый ОписаниеОповещения(
"ВыполнитьПослеПомещенияФайла", ЭтотОбъект
);

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите файл";
Диалог.ПолноеИмяФайла = "";
Диалог.ПредварительныйПросмотр = Истина;

НачатьПомещениеФайла(
ОповещениеОЗавершении,
, // адрес в хранилище
Диалог, // имя файла
Истина, // интерактивно
ЭтаФорма.УникальныйИдентификатор
);

КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьПослеПомещенияФайла(Результат, Адрес,

ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт

Если Результат Тогда

АдресФайлаВХранилище = Адрес;
ВыбФайл = Новый Файл(ВыбранноеИмяФайла);
ПараметрыФайла = Новый Структура("Имя",ВыбФайл.Имя);
ПараметрыФайла.Вставить("ПолноеИмя",ВыбранноеИмяФайла);
ПараметрыФайла.Вставить("Расширение",ВыбФайл.Расширение);
ПараметрыФайла.Вставить("АдресФайлаВХранилище",АдресФайлаВХранилище);

Оповещение = Новый ОписаниеОповещения("СоздатьФайлСДискаПослеПолученияРазмера", ЭтотОбъект, ПараметрыФайла);
ВыбФайл.НачатьПолучениеРазмера(Оповещение);

Иначе

Сообщить("Не удалось загрузить/передать файл на сервер.");

КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура СоздатьФайлСДискаПослеПолученияРазмера(Размер, ДополнительныеПараметры) Экспорт

ДополнительныеПараметры.Вставить("Размер",Размер);
ЗаписатьЭлемент(ДополнительныеПараметры);

Сообщить("Файл " +
ДополнительныеПараметры.ПолноеИмя + " передан на сервер и сохранён в справочнике файлов.");
Элементы.Список.Обновить();

КонецПроцедуры

roma n 27.03.2019 16:12

И падает на НачатьПомещениеФайла? Правильно понимаю?

US1C 27.03.2019 16:50

(9) Нет. На этой строке:

ВыбФайл.НачатьПолучениеРазмера(Оповещение);

roma n 27.03.2019 17:24

(10) из СП НачатьПомещениеФайла()

<ВыбранноеИмяФайла> - Через этот параметр возвращается путь к файлу, указанный в диалоге выбора файла. Для неинтерактивного режима выбранное имя файла соответствует начальному имени файла. В режиме запуска "Веб-клиент" значение параметра зависит от типа браузера. Для Mozilla Firefox 3 в параметре возвращается только имя файла без пути. Для Microsoft Internet Explorer возвращаемое значение зависит от настройки текущей зоны. Подробности: [url]http://msdn.microsoft.com/en-us/library/ms535128(VS.85).aspx[/url],

roma n 27.03.2019 17:25

+ (11) Проверь ВыбФайл.Существует()

US1C 27.03.2019 17:33

(11,12) Да, спасибо. Проверю.

US1C 28.03.2019 15:30

(11) Вот тут-то собака и оказалась зарыта. Возвращается только имя файла. Соответственно не могу обращаться к реальному файлу по полному пути. Теперь осталось понять, как можно вытянуть путь к файлу в web-клиенте.

roma n 28.03.2019 15:58

(14) зачем? Раз ты его на сервер передаешь - на сервере всё необходимое и вычисли

US1C 28.03.2019 16:34

(15) Так я его на сервере получаю в виде ХранилищаЗначения по переданному Адресу временного хранилища. Как мне получить из этого свойства файла в виде полного пути и размера?

roma n 28.03.2019 17:17

Размер вычислишь. А вот полный путь - таки да, не получишь.
Не зню сработает ли в вебе, но обрати внимание на НачатьПомещениеФайлОВ. Там фишка в третьем параметре: он может принимать тип ДиалогВыбораФайла. Вот из него (возможно) можно будет и полный путь выкружить...

US1C 28.03.2019 17:30

(17) На полный путь пока решил забить. А размер получаю в обработчике до помещения файла. Там в "НачатьПомещениеФайла" последним параметром идет Оповещение, срабатывающее до помещения файла во временное хранилище и возвращающее ссылку на файл. Вот из нее и получаю размер. Хотя в тонком клиенте из нее можно и ПолноеИмя с путем получить, но не в web-е.


Текущее время: 14:43. Часовой пояс GMT +3.