Подтвердить что ты не робот

Получить файл из файла JCR Node

У меня есть следующий код для вставки "rose.gif" в roseNode. Но как я могу извлечь файл из репозитория?

    Node roseNode = session.getRootNode().getNode("wiki:encyclopedia/wiki:entry[1]/");

    File file = new File("rose.gif");
    MimeTable mt = MimeTable.getDefaultTable();
    String mimeType = mt.getContentTypeFor(file.getName());
    if (mimeType == null) mimeType = "application/octet-stream";

    Node fileNode = roseNode.addNode(file.getName(), "nt:file");

    System.out.println( fileNode.getName() );

    Node resNode = fileNode.addNode("jcr:content", "nt:resource");
    resNode.setProperty("jcr:mimeType", mimeType);
    resNode.setProperty("jcr:encoding", "");
    resNode.setProperty("jcr:data", new FileInputStream(file));
    Calendar lastModified = Calendar.getInstance();
    lastModified.setTimeInMillis(file.lastModified());
    resNode.setProperty("jcr:lastModified", lastModified);

    //retrieve file and output as rose-out.gif
    File outputFile = new File("rose-out.gif");
    FileOutputStream out = new FileOutputStream(outputFile);
4b9b3361

Ответ 1

Единственное, что вам действительно нужно сделать, это получить имя файла с именем "nt: file" node, а содержимое для файла из свойства jcr: data - на "jcr: content" child node.

JCR 1.0 и 2.0 немного отличаются тем, как вы получаете поток для двоичного значения свойства jcr: data. Если вы используете JCR 1.0, тогда код будет выглядеть следующим образом:

Node fileNode = // find this somehow
Node jcrContent = fileNode.getNode("jcr:content");
String fileName = fileNode.getName();
InputStream content = jcrContent.getProperty("jcr:data").getStream();

Если вы используете JCR 2.0, последняя строка немного отличается, потому что вам сначала нужно получить двоичный объект из значения свойства:

InputStream content = jcrContent.getProperty("jcr:data").getBinary().getStream();

Затем вы можете использовать стандартную утилиту потока Java для записи байтов из потока контента в файл.

Когда вы закончите работу с двоичным объектом, обязательно вызовите метод Binary dispose(), чтобы сообщить, что вы сделали это с помощью Binary, и что реализация может освободить все ресурсы, полученные двоичным объектом. Вы всегда должны это делать, хотя некоторые реализации JCR пытаются уловить ошибки программирования, возвратив поток, который при закрытии автоматически вызовет dispose() для вас.