2016-01-13 2 views
1

Мы разрабатываем приложение Magnolia Blossom/Spring, где конечный пользователь необходимо загрузить изображение в определенный момент. Поэтому мы планируем хранить эти изображения в качестве активов в Magnolia.Создайте актив в Magnolia programatically

Однако, с загруженным файлом MultipartFile, подготовленным на уровне контроллера Spring, я еще не нашел успешный способ сохранить загруженное изображение в актив Magnolia.

Я предполагаю, что должен быть более простой способ: программно (т. Е. Код Java) создает объект в Магнолии, когда, например, каким-то образом у вас есть только байты PNG/JPEG.

Неужели кто-то сделал это раньше?

ответ

2

С помощью от Magnolia forum вот что я получил:

private void saveImageAsEventAsset(final MultipartFile multipartFile, final ImageInfo imageInfo, final String prefix) { 
     MgnlContext.doInSystemContext(
       new MgnlContext.VoidOp() { 
        @Override 
        public void doExec() { 
         try { 
          String fileExtension = FilenameUtils.getExtension(multipartFile.getOriginalFilename()); 
          String newFileName = prefix + "_" + Calendar.getInstance().getTimeInMillis() + "." + fileExtension; 

          // "Navigate" to the assets folder node 
          AssetProviderRegistry assetProviderRegistry = Components.getComponent(AssetProviderRegistry.class); 
          JcrAssetProvider jcrAssetProvider = (JcrAssetProvider) assetProviderRegistry.getProviderById(DamConstants.DEFAULT_JCR_PROVIDER_ID); 
          JcrFolder assetFolder = (JcrFolder) jcrAssetProvider.getFolder("/event"); 
          Node assetFolderNode = assetFolder.getNode(); 

          // Create asset node 
          Node assetNode = JcrUtils.getOrAddNode(assetFolderNode, newFileName, AssetNodeTypes.Asset.NAME); 
          assetNode.setProperty(AssetNodeTypes.Asset.ASSET_NAME, newFileName); 

          Session session = MgnlContext.getJCRSession(DamConstants.WORKSPACE); 

          // Create asset resource node 
          Node assetResourceNode = JcrUtils.getOrAddNode(assetNode, AssetNodeTypes.AssetResource.RESOURCE_NAME, AssetNodeTypes.AssetResource.NAME); 
          assetResourceNode.setProperty(AssetNodeTypes.AssetResource.DATA, session.getValueFactory().createBinary(multipartFile.getInputStream())); 
          assetResourceNode.setProperty(AssetNodeTypes.AssetResource.FILENAME, newFileName); 
          assetResourceNode.setProperty(AssetNodeTypes.AssetResource.EXTENSION, fileExtension); 
          assetResourceNode.setProperty(AssetNodeTypes.AssetResource.SIZE, Long.toString(multipartFile.getSize())); 
          assetResourceNode.setProperty(AssetNodeTypes.AssetResource.MIMETYPE, imageInfo.getMimeType()); 
          assetResourceNode.setProperty(AssetNodeTypes.AssetResource.WIDTH, Long.toString(imageInfo.getWidth())); 
          assetResourceNode.setProperty(AssetNodeTypes.AssetResource.HEIGHT, Long.toString(imageInfo.getHeight())); 

          session.save(); 
         } catch (Exception e) { 
          logger.debug("Could not save image as event asset", e); 
         } 
        } 
       } 
     ); 
    } 

где org.devlib.schmidt.imageinfo. ImageInfo параметр исходит из предыдущей проверки, что загруженный файл MultipartFile - это изображение, а префикс String - это то, что нам нужно в названии актива.

Смежные вопросы