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