Получить файл из файлового узла JCR - PullRequest
14 голосов
/ 14 января 2011

У меня есть следующий код для вставки "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);

1 Ответ

18 голосов
/ 14 января 2011

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

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, чтобы записать байты из потока контента в файл.

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

...