【问题标题】:Create asset in Magnolia programmatically以编程方式在 Magnolia 中创建资产
【发布时间】:2026-01-16 00:00:02
【问题描述】:

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

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

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

以前有人做过吗?

【问题讨论】:

    标签: spring file-upload magnolia


    【解决方案1】:

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

    【讨论】: