Jackrabbit 文件上传下载

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();
        }
    }
}



你可能感兴趣的:(java学习)