Storage

Storage

Zkopírovat odkaz na sekcikonfigurace

Možné typy úložišť - základní implementace

  • filesystemstorage - složka na disku, rychlé, nepodporuje přístup dle id, bez možnosti dotazování dle query (se StorageService lze dotazovat pouze dle path)
  • databasestorage - na základě db tabulky, co úložiště to vlastní db tabulka, id souborů unikátní v rámci této tabulky

Doplňkové implementace

  • publishstorage - kombinace lokalni filesystem storage pro uložení obsahu souborů na disku s db implementací pro metadata
  • s3storage - kombinace db implementace pro uložení metadat a S3 úložištěm pro obsah souborů (pro služby jako Amazon S3, DigitalOcean Spaces, Linode Object Storage, Cloudflare R2)
  • segmentedstorage - lze vytvářet virtuální úložiště, které jsou jen výsekem hlavního (používá se pro důsledné oddělení prostoru pro ms s vlasním oprávněním)
  • combinedstorage - umožňuje kombinované úložiště, které ukládá data na jedno z nastavených úložišť dle nastavení upload settings
  • delegatestorage - úložiště, které veškeré požadavky pouze deleguje na jiné (pro speciální případy, např. s vlastní implementací storage)

Zkopírovat odkaz na sekciStorage traits

Od v10 je db struktura rozšiřitelné dle konfigurace traits. Je nutné nastavit adam implementace (atributem dialect) - tedy:

xml
1 <!-- uzivatelsky vkladany verejny obsah (polozka soubory v administraci) -->  2<publishstorage id="f.file" 3  dialect="adam"4  name="Soubory" normalize="true" fileVariantThreadPool="image"  5  path="/data/storage-file" url="${edee.context}/file/edee/" trash="/trash"  6  table="STORAGE_FILE" connection="c.edee"  7  localizedMetadataTable="STORAGE_FILE_METADATA"  8  relatedTagsTable="EDEE_TAG_FILE_REL"9  traits="plainMetadata,expirableMetadata,stagePublish,motiveMetadata,importMetadata"    10  secured="true"/>

Existující traits:

  • expirableMetadata - platnost od-do
  • plainMetadata - titulek, autor, popis, datum, klíčová slova
  • localizedMetadata - 1:n vazba na přetížení metadata dle jazyka (nastavení atributem localizedMetadataTable)
  • relatedTags - 1:n vazba na štítky (nastavení atributem relatedTagsTable)
  • publishMetadata - původní podoba, tedy včetně custom1-custom9, platnosti, a základních metadat (na nových projektech je vhodnější nahradit dle potřeby za plainMetadata ...)
  • motiveMetadata - přiřazení obrázku ze stejného úložiště jako motivu
  • importMetadata - rozšíření o identifikátor ze zdrojového systému
  • stagePublish - povolí publikace souboru do stage modulu (v kombinaci s nastavením stage modulu)

Zkopírovat odkaz na sekcijava api

Existuje několik cest jak lze využít Storage API.

  • Spring resource - vhodné pro práci s jednotlivými soubory, výhodou je možnost vyměnit za jinou resource implementaci (filesystem, classpath, http url apod.)
  • CpsModuleStorageSupport - základní přístup ke obsahu storage, vhodné pro vytváření položek, importy apod.
  • StorageService - extenze pro lepší práci s uložišti s využítím query, cachování na straně service, zjednodušené dotazování do standardního úložiště (f.file) apod.

Preferovaná cesta od Edee v10 je práce pomocí StorageService

Zkopírovat odkaz na sekciEdee UI support

Standardní úložiště (f.file) je dostupné pomocí správce souborů.

Ve slovníku je připravena stránka (fileBrowserPage) pro vytvoření správce vlastního úložiště.

Zkopírovat odkaz na sekciPráce se Storage API

Zkopírovat odkaz na sekciPřístup pomocí Spring Resource

Preferovaná varianta je pracovat primárně se Spring resource, kde je podpora pro tzv. StorageResource a PublishStorageResource. Pro přístup je nutné použít org.springframework.core.io.ResourceLoader v podobě aplikačního kontextu (stačí využít Autowired)

Obě cesty podporují následující

  • org.springframework.core.io.WritableResource - do resource lze zapisovat
  • com.fg.webapp.cps.v1.modules.spring.resource.OriginAwareResource - zpřístupňuje původní location resource
  • com.fg.webapp.cps.v1.modules.spring.resource.IdProviderResource - pro získání id souboru a úložiště
  • com.fg.webapp.cps.v1.core.store.misc.metadata.FileItemPublishMetadataAccessor - práce s metadaty položky úložiště
  • reprezentaci v podobě souboru java.io.File konkrétně implementace com.fg.webapp.cps.v1.modules.spring.resource.CpsModuleStorageFile získané pomocí Resource#getFile() - je nutné počítat, že podpora file API je pouze částečná

Zkopírovat odkaz na sekcistorageResource

Přístup pomocí location ve tvaru (poslední část nemusí být jen path, ale i id)

1 storage:storageId:/path

Příklad

1 storage:f.file:/2020/07

Výsledný resource je vlastně jen ukazatelem na úložiště a cestu, která se vyhodnotí při požadavku na data. Opakovaná práce s resourcem, tak může vést k několikanásobnému dotazu na storage api, potažmo na DB.

Zápis do output stream neprobíhá přes upload část storage, takže není prováděna kontrola a zpracování dat definované jako uploadAction, lze ale využít k tomu určené metody (uploadFileContent a getUploadingOutputStream).

Zkopírovat odkaz na sekcipublishStorageResource

Vzniká obdobně pomocí location ve tvaru

1 publishStorage:storageId:/path

Vyhodnocení proběhne v okamžiku vzniku instance resource (pokud sílový soubor neexistuje vzniká MissingPublishStorageResource).

Instance resource drží interně objekt FileItem - soubor nebo adresář úložiště. Zápis pomocí outputStream pracuje s upload metodami API, reálně k akci dochází po uzavření streamu.

Zkopírovat odkaz na sekciPřímý přístup ke Storage API

Pro základní operace lze využít com.fg.webapp.cps.v1.modules.CpsModuleStorageSupport.

Kompletní sada funkcí pro úložiště je pak pomocí třídy com.fg.webapp.cps.v1.core.store.Storage poskytující primárně com.fg.webapp.cps.v1.core.store.FileItem položky.

Instanci lze získat pomocí následující konstrukce

java
1 import com.fg.webapp.cps.v1.CPS;2import com.fg.webapp.cps.v1.core.security.User;3import com.fg.webapp.cps.v1.core.store.Storage;4import com.fg.webapp.cps.v1.modules.CpsModuleSupport;5
6public class Test {7
8    @Autowired9    CpsModuleSupport cpsModuleSupport;10
11    void example() {12        String storageId = "f.file";13        Storage storage = cpsModuleSupport.getStorageSupport().getStorageById(storageId);14
15        // pokud je vhodne pracovat s pravy uzivatele, je nutne predat jeho objekt 16        User user = cpsModuleSupport.getSecuritySupport().getLoggedInUser();17        Storage storageWithSecurity = cpsModuleSupport.getStorageSupport().wrapStorageAsSecured(storage,user);18    }19
20}