2011-01-13 30 views
12

से फ़ाइल प्राप्त करें मेरे पास गुलाब नोड में "rose.gif" डालने के लिए निम्न कोड है। लेकिन मैं रिपोजिटरी से फ़ाइल कैसे प्राप्त करूं? संपत्ति पर: नोड, और से फ़ाइल के लिए सामग्री "डेटा jcr":जेसीआर फ़ाइल नोड

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

उत्तर

16

केवल एक चीज आप वास्तव में क्या करने की जरूरत "फ़ाइल NT" के नाम से फ़ाइल का नाम मिलता है "जेसीआर: सामग्री" बाल नोड।

जेसीआर 1.0 और 2.0 बाइनरी "जेसीआर: डेटा" संपत्ति मूल्य के लिए स्ट्रीम कैसे प्राप्त करते हैं, इस बारे में थोड़ा अलग है। आप 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(); 

फिर आप मानक जावा धारा उपयोगिता का उपयोग फ़ाइल में 'सामग्री' धारा से बाइट्स लिखने के लिए कर सकते हैं।

आप बाइनरी वस्तु के साथ काम हो गया है, बाइनरी के dispose() विधि कॉल करने के संकेत है कि आप बाइनरी के साथ और कहा कि कार्यान्वयन सभी संसाधनों बाइनरी वस्तु द्वारा अधिग्रहीत जारी कर सकते हैं काम हो गया बताने के लिए सुनिश्चित करें। आपको हमेशा ऐसा करना चाहिए, भले ही कुछ जेसीआर कार्यान्वयन स्ट्रीमिंग त्रुटियों को पकड़ने की कोशिश करते हैं, जो बंद होने पर, स्वचालित रूप से आपके लिए dispose() पर कॉल करेगा।

+0

हाय रैंडल, जो मैं चाहता हूं वह आउटपुटस्ट्रीम है और इनपुट स्ट्रीम नहीं है। क्या यह संभव है? – Steve

+0

मैंने इसे समझ लिया। इनपुट इनपुट को बाइट द्वारा आउटपुटस्ट्रीम बाइट में परिवर्तित कर दिया। – Steve

+0

2.0 के लिए, मुझे लगता है कि जब आप w/बाइनरी ऑब्जेक्ट (http://www.day.com/specs/jcr/2.0/5_Reading.html) करते हैं तो आपको Binary.dispose() को कॉल करना होगा। –