1. 在配置文件config.properties中: file.rmi=http://localhost:7000/rmi
2. 下载 jackrabbit-standalone-2.10.1.jar,打开服务:java -jar jackrabbit-standalone-2.10.1.jar --port 7000
3.
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import javax.jcr.LoginException;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import org.apache.jackrabbit.rmi.repository.URLRemoteRepository;
import org.springframework.stereotype.Service;
/**
* 文件服务(调用 JackRabbit 管理上传后的文件)
*
* JackRabbit实现了JSR 170规范,其管理文件的方式是通过维护一棵文件树来管理。
*
*
*/
@Service("fileService")
public class FileService {
/**
* RMI地址
*/
private final static String RMI = "http://localhost:7000/rmi";
/**
* 仓库
*/
private static Repository repository = null;
/**
* 初始化仓库
*
* @return
*/
public Repository init() {
if (null == repository) {
try {
repository = new URLRemoteRepository(RMI);
} catch (MalformedURLException 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();
}
}
}