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的相关流程代码。