2011-01-13 32 views
12

Tôi có đoạn mã sau để chèn "rose.gif" vào một roseNode. Nhưng làm cách nào để truy xuất tệp từ kho lưu trữ?Lấy tệp ra khỏi tệp JCR Node

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

Trả lời

16

Điều duy nhất bạn thực sự cần phải làm là lấy tên của tập tin từ tên của "nt: tập tin" nút, và nội dung cho các tập tin từ "JCR: dữ liệu" tài sản trên nút "jcr: content" con.

JCR 1.0 và 2.0 khác nhau một chút về cách bạn nhận luồng cho giá trị thuộc tính "jcr: data" nhị phân. Nếu bạn đang sử dụng JCR 1.0, thì mã sẽ như thế này:

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

Nếu bạn đang sử dụng JCR 2.0, dòng cuối cùng hơi khác một chút vì trước tiên bạn phải lấy đối tượng nhị phân từ thuộc tính Giá trị:

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

Sau đó, bạn có thể sử dụng tiện ích luồng Java chuẩn để ghi byte từ luồng 'nội dung' vào tệp.

Khi bạn hoàn thành đối tượng nhị phân, hãy nhớ gọi phương thức nhị phân dispose() của Binary để báo hiệu rằng bạn đã thực hiện với nhị phân và việc triển khai có thể giải phóng tất cả các tài nguyên mà đối tượng nhị phân thu được. Bạn nên luôn luôn làm điều này, mặc dù một số triển khai JCR cố gắng bắt lỗi lập trình bằng cách trả về luồng, khi đóng, sẽ tự động gọi dispose() cho bạn.

+0

Xin chào Randall, những gì tôi muốn là một OutputStream và không phải là luồng đầu vào. Điều này có thể không? – Steve

+0

Tôi đã tìm ra. Chỉ cần chuyển đổi inputStream thành một byte outputStream theo byte. – Steve

+0

Đối với 2.0, tôi nghĩ bạn phải gọi Binary.dispose() khi bạn hoàn thành w/đối tượng nhị phân (http://www.day.com/specs/jcr/2.0/5_Reading.html). –

Các vấn đề liên quan