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:
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:/pathPříklad
1 storage:f.file:/2020/07Vý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:/pathVyhodnocení 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
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}