以编程方式在 Magnolia 中创建资产

Create asset in Magnolia programmatically

我们正在开发 Magnolia Blossom / Spring 应用程序,最终用户 需要在某个时候上传图片。所以我们正在考虑将这些图像作为资产存储在 Magnolia 中。

但是,在 Spring 控制器级别准备好上传的 MultipartFile 后,我还没有找到将上传的图像存储到 Magnolia 资产中的成功方法。

我想应该有一些更简单的方法 以编程方式 (即 Java 代码)在 Magnolia 中创建资产,例如,通过某种方式,您有只是 PNG / JPEG 的字节。

以前有人做过吗?

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 是图像和前缀字符串正是我们在资产名称中需要的东西。