Здравствуйте! Подскажите пожалуйста, при загрузке файлов в объекты через интерфейс миниатюры создаются автоматически, поля [Thumbnail] и [ThumbnailFfileSize] заполняются.
Когда я загружаю скриптом картинки с диска в файлы объектов, поля с миниатюрами не заполняются. Каким образом их можно заполнить через скрипты, чтобы миниатюры показывались в изображениях объекта ? Также хотелось бы узнать, как скриптами получить размеры картинки (высоту и ширину).
Нравится
Здравствуйте, Александр!
Уточните, пожалуйста, Ваш продукт и версию. А также, укажите название объектов и таблиц.
у нас BPM Online Realty,
Версия 5.4.1.836
Файлы загружаем в "Файл и ссылка объекта" (FacilityFile), связывая с объектом (Facility)
Код для загрузки через TransactSQL
Александр, в приложении BPMonline Realty логика заполнения Thumbnail и ThumbnailFfileSize реализована в процессе страницы "Страница редактирования файла и ссылки объекта" (FacilityFileEditPage) на событии DataSourceBeforeSaveServer в элементе Сохранить миниатюру изображения (SaveIimageThumbnailScript):
А возможно ли это все на sql написать, м.б какую-нибудь функцию можно дополнительно подключить ? Либо создать процесс, который будет по всем файлам массово создавать миниатюры
Да, возможно, необходимо в sql реализовать ту же логику, что и в указанном ранее скрипте. За исключением того, что в sql нет возможности реализовать изменение размера картинки для миниатюры. В связи с этим, необходимо будет загружать уже подготовленные заранее файлы.
В указанном ранее скрипте как раз и есть изменение размера картинки для создания миниатюры, то что мне нужно ...
раз в sql нет такой возможности, подскажите пожалуйста, как мне создать процесс по аналогии с тем, который висит на сохранении файла, непосредственно в интерфейсе для разового запуска, чтобы по всем файлам автоматически создались миниатюры?
Александр, предлагаю следующий вариант: создать действие в разделе "Объекты" по запуску которого будет выполняться поиск всех файлов во всех объектах, у которых не заполнены поля [Thumbnail] и [ThumbnailFfileSize] с последующим заполнением. Для этого необходимо выполнить следующие действия:
1. Добавить новое действие в раздел "Объекты". Для этого необходимо перейти в режим настройки, открыть список действий и выбрать пункт "Настроить". Для добавленного действия необходимо настроить процесс.
2. В процессе с помощью EntitySchemaQuery требуется осуществлять выбор записей из таблицы FacilityFile, у которых не заполнены поля [Thumbnail] и [ThumbnailFfileSize].
3. Для выбранных записей в цикле необходимо выполнять логику, аналогичную скрипту SaveIimageThumbnailScript процесса страницы "Страница редактирования файла и ссылки объекта" (FacilityFileEditPage).
Спасибо!
А подскажите пожалуйста, можно ли как-нибудь вытащить через sql список ссылочных полей и на какую таблицу они ссылаются? а также возможность в sql подсмотреть какое поле является основным для отображения по ссылке
Александр, если я Вас правильно понял, касательно списка ссылочных полей, то это возможно сделать следующим образом: http://stackoverflow.com/questions/483193/how-can-i-list-all-foreign-ke…
Касательно первичного (основного) поля для отображения - возможно увидеть в свойствах объекта в BPMonline.
Настроили процесс аналогично процессу на сохранение файлов, написали скрипт, сохраняется нормально, но при запуске процесса возникает ошибка:
Exception Message: Token String in state Object would result in an invalid JavaScript object.
Exception Type: Newtonsoft.Json.JsonWriterException
Exception Source: Newtonsoft.Json
ругается на byte[] fileThumbnail = Convert.FromBase64String((string)FileContent);
методы GetImageSize и ResizeImage добавлены.
var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager,"FacilityFile"); string idColumnName = esqQuery.AddColumn("Id").Name; string DataColumnName = esqQuery.AddColumn("Data").Name; string ThumbColumnName = esqQuery.AddColumn("Thumbnail").Name; string SizeColumnName = esqQuery.AddColumn("ImageWidthXHeight").Name; string ThumSizeColName = esqQuery.AddColumn("ThumbnailFfileSize").Name; var filter = esqQuery.CreateIsNullFilter(ThumbColumnName); esqQuery.Filters.Add(filter); var entity = esqQuery.GetEntityCollection(UserConnection); foreach (var record in entity) { Guid Id = record.GetTypedColumnValue<Guid>(idColumnName); FileContent = record.GetTypedColumnValue<string>(DataColumnName); if (FileContent != null) { byte[] fileThumbnail = Convert.FromBase64String((string)FileContent); MemoryStream fileThumbnailResizedStream = ResizeImage(fileThumbnail, 200, 100); string ImageWidthXHeight = GetImageSize(fileThumbnail); if (fileThumbnailResizedStream != null) { byte[] fileThumbnailResized = fileThumbnailResizedStream.ToArray(); var update = new Update(UserConnection, "FacilityFile") .Set("Thumbnail", Column.Parameter(fileThumbnailResized)) .Set("ImageWidthXHeight", Column.Parameter(ImageWidthXHeight)) .Set("ThumbnailFfileSize", Column.Parameter(fileThumbnailResized.Length)) .Where("Id").IsEqual(Column.Parameter(Id)); update.Execute(); } } } return true;
Подскажите пожалуйста, как там правильно вытаскивать "файл" из базы?
В базе данных файлы хранятся в колонке с типом varbinary. О преобразовании написано здесь: http://stackoverflow.com/questions/8279553/converting-varbinary-to-image
По примеру сделать не получилось, "Имя типа или простанства имен "Linq" отсутствует в пространстве имен "System.Data" (пропущена ссылка на сборку?)" :(
Спасибо за помощь! Вопрос снят. Пример не пригодился, подправили типы данных и все заработало