объект_файл_миниатюра_размер_загрузка
Технические вопросы
7.x

Загрузка файлов с диска

Здравствуйте! Подскажите пожалуйста, при загрузке файлов в объекты через интерфейс миниатюры создаются автоматически, поля [Thumbnail] и [ThumbnailFfileSize] заполняются.
Когда я загружаю скриптом картинки с диска в файлы объектов, поля с миниатюрами не заполняются. Каким образом их можно заполнить через скрипты, чтобы миниатюры показывались в изображениях объекта ? Также хотелось бы узнать, как скриптами получить размеры картинки (высоту и ширину).

Нравится

13 комментариев

Здравствуйте, Александр!

Уточните, пожалуйста, Ваш продукт и версию. А также, укажите название объектов и таблиц.

у нас 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" (пропущена ссылка на сборку?)" :(

Спасибо за помощь! Вопрос снят. Пример не пригодился, подправили типы данных и все заработало

Показать все комментарии