前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Apache JackRabbit 入门初体验

Apache JackRabbit 入门初体验

作者头像
CodeWwang
发布2022-08-24 10:56:34
8750
发布2022-08-24 10:56:34
举报
文章被收录于专栏:CodeWwang

Apache Jackrabbit™ 内容存储库是 Java 技术 API(JCR,在 JSR 170 和 JSR 283 中指定)的内容存储库的完全一致的实现。内容存储库是分层内容存储,支持结构化和非结构化内容、全文搜索、版本控制、事务、观察等。Jackrabbit Oak 是 JCR 规范的补充实现。努力实现可扩展且高性能的分层内容存储库,以用作现代世界级网站和其他要求苛刻的内容应用程序的基础

  以上是Apache JackRabbit上的一段内容,最近单位做的系统需要一定的安全性。本来想的是用它来作为测试开发的文件上传保存内容库,后来研究了开源的一些文件存储库后,觉得对于当前的并发量来说,对象存储和分布式文件系统都并不是一个安全的方法。 后期需要请专门的安全团队对系统存储方面做一个评估。

  下面贴上JackRabbit上传和下载文件的代码。

FileService
代码语言:javascript
复制
public class FileService { 
 /** 
     * RMI地址 
     */ 
 private final static String RMI = "http://127.0.0.1:7000/rmi"; 
 /** 
     * 仓库 
     */ 
 private static Repository repository = null; 
 /** 
     * 初始化仓库 
     *  
     * @return 
     */ 
 public Repository init() { 
 if (null == repository) { 
 try { 
 //repository = new URLRemoteRepository(RMI); 
                repository = JcrUtils.getRepository(); 
 } catch ( RepositoryException e) { 
 System.out.println("----------------------JackRabbit 仓库初始化失败----------------------"); 
                e.printStackTrace(); 
 } 
 } 
 return repository; 
 } 
 /** 
     * 获取Session 
     *  
     * @return 
     */ 
 public Session getSession() { 
 Session session = null; 
 try { 
            session = init().login(new SimpleCredentials("admin", "admin".toCharArray())); 
 } catch (LoginException e) { 
            e.printStackTrace(); 
 } catch (RepositoryException e) { 
            e.printStackTrace(); 
 } 
 return session; 
 } 
 /** 
     * 向仓库中存入一个文件 
     * @param is 待存入文件的输入流 
     * @return 
     */ 
 public String save(InputStream is) { 
 //获取一个UUID作为文件id 
 String fileId = KeyProvider.getPrimaryKey(); 
 //获取Session 
 Session session = getSession(); 
 try { 
 //获取根节点 
 Node root = session.getRootNode(); 
 //给根节点添加一个文件节点 
 Node filenode = root.addNode(fileId, "nt:file"); 
 //给文件节点添加一个资源节点 
 Node resourcenode = filenode.addNode("jcr:content", "nt:resource"); 
 //设置资源节点的MIME类型 
            resourcenode.setProperty("jcr:mimeType", "application/octest-stream"); 
 //设置待存入文件的输入流 
            resourcenode.setProperty("jcr:data", is); 
 //设置编码 
            resourcenode.setProperty("jcr:encoding", "UTF-8"); 
 //保存文件 
            session.save(); 
 //关闭输入流 
            is.close(); 
 //注销Session 
            session.logout(); 
 } catch (RepositoryException e) { 
 System.out.println("---------------------上传文件过程中出现异常------------------------"); 
            e.printStackTrace(); 
 } catch (IOException e) { 
 System.out.println("---------------------上传文件过程中出现异常------------------------"); 
            e.printStackTrace(); 
 } 
 return fileId; 
 } 
 /** 
     * 按Fileid取出单个文件(相当于下载) 
     * @param fileId 保存文件时拿到的FileId 
     * @return 
     */ 
 public InputStream getByFileId(String fileId) { 
 //用于读取文件的输入流对象 
 InputStream is = null; 
 //获取Session 
 Session session = getSession(); 
 try { 
 //获取根节点 
 Node root = session.getRootNode(); 
 //按照FileId取出符合条件的节点 
 NodeIterator filenodeite = root.getNodes(fileId); 
 if (filenodeite.hasNext()) { 
 //如果能找到相关记录 
 while (filenodeite.hasNext()) { 
 //取出一个文件节点 
 Node filenode = filenodeite.nextNode(); 
 //取出这个文件结点下的资源子节点 
 NodeIterator resourcenodeite = filenode.getNodes(); 
 //如果有资源子节点 
 while (resourcenodeite.hasNext()) { 
 //取出一个资源节点 
 Node resourcenode = resourcenodeite.nextNode(); 
 //找出数据域 
 if (resourcenode.getName().equals("jcr:content")) { 
 //得到文件输入流 
                            is = resourcenode.getProperty("jcr:data").getStream(); 
 } 
 } 
 } 
 } 
 } catch (RepositoryException e) { 
            e.printStackTrace(); 
 } 
 return is; 
 } 
 /** 
     * 按Fileid删除文件 
     * @param fileId 保存文件时拿到的FileId 
     * @return 
     */ 
 public void delete(String fileId) { 
 //获取Session 
 Session session = getSession(); 
 try { 
 //获取根节点 
 Node root = session.getRootNode(); 
 //按照FileId取出符合条件的节点 
 NodeIterator filenodeite = root.getNodes(fileId); 
            filenodeite.remove(); 
            session.save(); 
 //注销Session 
            session.logout(); 
 } catch (RepositoryException e) { 
 System.out.println("----------------------删除过程中出错-------------------------"); 
            e.printStackTrace(); 
 } 
 } 
} 

保存文档

   调用上面的FileService操作内容仓库。

代码语言:javascript
复制
 String fileId = fileService.save(doc.getInputStream()); 

所需依赖
代码语言:javascript
复制
 <!-- Jack Rabbit相关配置 --> 
 <!-- JCR API --> 
 <dependency> 
 <groupId>javax.jcr</groupId> 
 <artifactId>jcr</artifactId> 
 <version>2.0</version> 
 </dependency> 
 <!-- jackrabbit-jcr-commons --> 
 <dependency> 
 <groupId>org.apache.jackrabbit</groupId> 
 <artifactId>jackrabbit-jcr-commons</artifactId> 
 <version>2.4.3</version> 
 </dependency> 
 <!-- jackrabbit-core --> 
 <dependency> 
 <groupId>org.apache.jackrabbit</groupId> 
 <artifactId>jackrabbit-core</artifactId> 
 <version>2.4.3</version> 
 </dependency> 
 <!-- jackrabbit-jcr-rmi --> 
 <dependency> 
 <groupId>org.apache.jackrabbit</groupId> 
 <artifactId>jackrabbit-jcr-rmi</artifactId> 
 <version>2.4.3</version> 
 </dependency> 

以上是JackRabbit的相关流程代码。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • FileService
  • 保存文档
  • 所需依赖
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档