2012-07-12 20 views
8

मेरे पास एक फ़ाइल इनपुट नियंत्रण है।रावेनडीबी संलग्नक - कार्यक्षमता कैसे करें?

<input type="file" name="file" id="SaveFileToDB"/> 

चलें कहते हैं कि मैं सेल्सियस के लिए ब्राउज़ करें: दस्तावेज़ /Instruction.pdf और सबमिट करें पर क्लिक करें। सबमिट पर, मैं दस्तावेज़ को RavenDB में सहेजना चाहता हूं और बाद में इसे डाउनलोड उद्देश्यों के लिए पुनर्प्राप्त करना चाहता हूं। मैं इस लिंक http://ravendb.net/docs/client-api/attachments कि कहते हैं .. ऐसा करने के देखा ..

Stream data = new MemoryStream(new byte[] { 1, 2, 3 }); 

documentStore.DatabaseCommands.PutAttachment("videos/2", null, data, 
    new RavenJObject {{"Description", "Kids play in the garden"}}); 

मैं निम्नलिखित नहीं कर रहा हूँ क्या 1,2,3 यहाँ मतलब है और यह क्या आदेश में वीडियो/2 कहने के लिए इसका मतलब है ... मैं कैसे मेरे मामले में इसका उपयोग करने के लिए इन दो लाइनों का उपयोग कर सकते हैं .. ravendb में शब्द/पीडीएफ को सहेजने के लिए .. अगर किसी ने पहले ऐसी चीज की है, तो कृपया सलाह दें।

मैं एक चीज़ पर स्पष्ट नहीं हूं .. अनुलग्नक कैसे संग्रहीत किया जाता है। अगर मैं खुद को अटैचमेंट स्टोर करना चाहता हूं (पीडीएफ कहें) इसे रैवेन्डेब में स्वतंत्र रूप से संग्रहीत किया जाता है .. और मैं केवल मुख्य दस्तावेज़ में अटैचमेंट की कुंजी संग्रहीत करता हूं जो इसके साथ जुड़ा हुआ है? यदि ऐसा है, तो पीडीएफ भौतिक रूप से ravendb में संग्रहीत किया जाता है? क्या मै इसे देख सकता हूँ?

उत्तर

11

1,2,3 केवल उदाहरण डेटा है। यह पूरा करने का प्रयास कर रहा है कि आप जो चाहें उसकी मेमोरी स्ट्रीम बनाते हैं, फिर PutAttachment विधि में उस मेमोरी स्ट्रीम का उपयोग करें। नीचे तदर्थ है और परीक्षण नहीं किया लेकिन काम करना चाहिए:

 using (var mem = new MemoryStream(file.InputStream) 
     { 
      _documentStore.DatabaseCommands.PutAttachment("upload/" + YourUID, null, mem, 
                  new RavenJObject 
                   { 
                    { "OtherData", "Can Go here" }, 
                    { "MoreData", "Here" } 
                   }); 
     } 

संपादित सवालों

  1. से बाकी के लिए कैसे लगाव संग्रहीत किया जाता है? मेरा मानना ​​है कि यह एक जेसन दस्तावेज है जिसमें संलग्नक
  2. की बाइट सरणी रखने वाली एक संपत्ति है जिसमें "दस्तावेज़" स्वतंत्र रूप से संग्रहीत है? हाँ। एक अनुलग्नक एक विशेष दस्तावेज़ है जो अनुक्रमित नहीं है लेकिन यह डेटाबेस का हिस्सा है ताकि प्रतिकृति कार्य जैसे कार्य।
  3. क्या मुझे मुख्य दस्तावेज़ में अनुलग्नक की कुंजी स्टोर करनी चाहिए जिसे वह संबद्ध करता है? हां आप कुंजी का संदर्भ लेंगे और कभी भी आप यह प्राप्त करना चाहते हैं कि आप उस आईडी के साथ अटैचमेंट के लिए रावेन से पूछें।
  4. क्या पीडीएफ भौतिक रूप से ravendb में संग्रहीत है? हाँ।
  5. क्या आप इसे देख सकते हैं? नहीं, ये भी (कम से कम के रूप में तक मुझे पता है) स्टूडियो में दिखता है

संपादित करें सही और अपडेट किया गया नमूना

 [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Upload(HttpPostedFileBase file) 
    { 
     byte[] bytes = ReadToEnd(file.InputStream); 
     var id = "upload/" + DateTime.Now.Second.ToString(CultureInfo.InvariantCulture); 
     using (var mem = new MemoryStream(bytes)) 
     { 
      DocumentStore.DatabaseCommands.PutAttachment(id, null, mem, 
                  new RavenJObject 
                  { 
                   {"OtherData", "Can Go here"}, 
                   {"MoreData", "Here"}, 
                   {"ContentType", file.ContentType} 
                  }); 
     } 

     return Content(id); 
    } 

    public FileContentResult GetFile(string id) 
    { 
     var attachment = DocumentStore.DatabaseCommands.GetAttachment("upload/" + id); 
     return new FileContentResult(ReadFully(attachment.Data()), attachment.Metadata["ContentType"].ToString()); 
    } 

    public static byte[] ReadToEnd(Stream stream) 
    { 
     long originalPosition = 0; 

     if (stream.CanSeek) 
     { 
      originalPosition = stream.Position; 
      stream.Position = 0; 
     } 

     try 
     { 
      var readBuffer = new byte[4096]; 

      int totalBytesRead = 0; 
      int bytesRead; 

      while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0) 
      { 
       totalBytesRead += bytesRead; 

       if (totalBytesRead == readBuffer.Length) 
       { 
        int nextByte = stream.ReadByte(); 
        if (nextByte != -1) 
        { 
         var temp = new byte[readBuffer.Length*2]; 
         Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length); 
         Buffer.SetByte(temp, totalBytesRead, (byte) nextByte); 
         readBuffer = temp; 
         totalBytesRead++; 
        } 
       } 
      } 

      byte[] buffer = readBuffer; 
      if (readBuffer.Length != totalBytesRead) 
      { 
       buffer = new byte[totalBytesRead]; 
       Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead); 
      } 
      return buffer; 
     } 
     finally 
     { 
      if (stream.CanSeek) 
      { 
       stream.Position = originalPosition; 
      } 
     } 
    } 

    public static byte[] ReadFully(Stream input) 
    { 
     byte[] buffer = new byte[16 * 1024]; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      int read; 
      while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       ms.Write(buffer, 0, read); 
      } 
      return ms.ToArray(); 
     } 
    } 
+0

में के रूप में तो तुम मेरे ओपी में की तरह उदाहरण के लिए एक पीडीएफ .. अपलोड करेंगे। – ZVenue

+0

यह स्टूडियो में दिखाई नहीं देता है, तो .. मैं कैसे संपादित प्रतिक्रिया के लिए अपने वहाँ – ZVenue

+0

धन्यवाद पता है। कोड से मेरा सवाल .. मैं नहीं देखता कि मैं पीडीएफ फ़ाइल कैसे प्राप्त कर सकता हूं जिसे मैं HTML फ़ाइल नियंत्रण से RavenDB में चुनता हूं। मैं कहां से गुजर रहा हूं .. मुझे वह नहीं दिख रहा है। – ZVenue

8
  • कैसे लगाव संग्रहीत किया जाता है?

इसे रावेनडीबी के अंदर बाइनरी डेटा के रूप में संग्रहीत किया जाता है। यह जेसन के रूप में संग्रहीत नहीं है।

  • क्या "दस्तावेज़" स्वतंत्र रूप से संग्रहीत है?

यहां कोई दस्तावेज़ नहीं है, आपके पास अटैचमेंट से जुड़ा कुछ मेटाडाटा है, यह एक समुद्री डाकू दस्तावेज़ नहीं है।

  • "क्या मुझे मुख्य दस्तावेज़ में अटैचमेंट की कुंजी को स्टोर करना चाहिए" से जुड़ा हुआ है?

हाँ, वहाँ उस के लिए क्वेरी करने के लिए कोई रास्ता नहीं है।

  • क्या पीडीएफ भौतिक रूप से ravendb में संग्रहीत है?

हाँ

  • आप इसे देख सकते हैं?

सिर्फ अगर आप अनुलग्नक पर सीधे जाने के, इस तरह के http://localhost:8080/static/ATTACHMENT_KEY

यह नहीं दिखाया जाएगा यूआई

+0

यदि यह एक निजी दस्तावेज़ है, तो क्या मैं अनुलग्नक का उपयोग करना चाहता हूं? क्या अन्य लोग इसे एक्सेस कर पाएंगे? – asunrey

संबंधित मुद्दे