Вопрос

Файл предпросмотра.

Подскажите пожалуйста где на стороне сервера формируется - 0/img/entity/hash/DocumentFile/Data/c9f2d9a4-4810-4a61-a2b2-ebabf04d1b9f

Мне необходимо вручную положить туда данные, но не могу понять где именно это сделать. Спасибо

У меня такой же вопрос

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

Она формируется при помощи Terrasoft.ImageUrlBuilder.getUrl(config), почитать об этом механизме можно тут.

Вызовы этой функции для детали файлов раздела реализованы в FileDetailV2 и ImageListViewModel:

   getExtensionImageUrl: function(id) {
    return this.Terrasoft.ImageUrlBuilder.getUrl({
     source: this.Terrasoft.ImageSources.ENTITY_COLUMN,
     params: {
      schemaName: "FileExtension",
      columnName: "Data",
      primaryColumnValue: id
     }
    });
   },
   fillExtensionsIcons: function(collection, callback) {
    const extensions = this.get("Extensions");
    this.Terrasoft.SysSettings.querySysSettingsItem("FileDetailDefaultIcon", function(response) {
     const defaultIconUrl = response
       ? this.getExtensionImageUrl(response.value)
       : this.Terrasoft.ImageUrlBuilder.getUrl(this.get("Resources.Images.DefaultIcon"));
     const defIconId = this.Terrasoft.generateGUID();
     extensions.add(defIconId, {
      "Extension": "default",
      "Url": defaultIconUrl
     });
     collection.each(function(item) {
      const extensionId = item.get("Id");
      const extensionName = item.get("Name").toLowerCase();
      const extensionUrl = this.getExtensionImageUrl(extensionId);
      if (extensionName !== "default") {
       extensions.add(extensionId, {
        "Extension": extensionName,
        "Url": extensionUrl
       });
      }
     }, this);
     if (callback) {
      callback.call(this);
     }
    }, this);
   },
  getImageUrl: function(entitySchemaName, Id) {
   if (this.isEntityLink) {
    var entity = this.getEntityLinkCacheById(Id);
    return Terrasoft.ImageUrlBuilder.getUrl({
     source: Terrasoft.ImageSources.SYS_SETTING,
     params: {
      r: this.getSysSettingImageByEntityName(entity.entityName)
     }
    });
   } else {
    return Terrasoft.ImageUrlBuilder.getUrl({
     source: Terrasoft.ImageSources.ENTITY_COLUMN,
     params: {
      schemaName: entitySchemaName,
      columnName: "Data",
      primaryColumnValue: Id
     }
    });
   }
  },

В одном случае генерируется миниатюра файла-изображения, в другом — стандартная иконка для известного типа файла, хранящаяся в таблице FileExtension. Например, для DOCX будет URL вида:

/0/img/entity/hash/FileExtension/Data/938104a8-be24-48b6-a55a-d62adf2e4119

 

Зверев Александр,

Это все мне понятно. можете подсказать пожалуйста в какой момент картинка попадает в эту папку, на каком уровне? Это какое-то локальное хранилище? виртуальный путь? Как туда вручную положить картинку??

На уровне ядра. Клиентский ImageUrlBuilder.js формирует URL и серверные Global.asax.cs и SchemaResourcesRouter.cs, которые преобразуют виртуальный путь в запрос к terrasoft.axd с нужными параметрами. Вам нужно переделывать не саму логику размещения, а чтобы в конфигурации к нему обращались в нужное время с нужными параметрами, как на детали файлов есть одна логика для картинок и другая — для иконок типов. Картинка, как видно по URL, сначала берётся из нужной записи нужной таблицы базы, при следующих считываниях по этому же URL должна кэшироваться.

Зверев Александр,

Просто у меня картинки хранятся в файловой системе, а в базе поле Data пустое, вот я и ищу способ решить проблему с предпросмотром. Что можете посоветовать в моем случае??

Можно хранить в файловой системе полноразмерные картинки, а в базе (в той же таблице или в специально сделанной) хранить миниатюры, с которыми и будет работать этот сервис.

Войдите или зарегистрируйтесь, чтобы комментировать