2012-07-12 50 views
8

Tôi có một điều khiển đầu vào tập tin.Tệp đính kèm RavenDB - Chức năng cách thực hiện?

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

phép nói rằng tôi duyệt đến C: /Instruction.pdf tài liệu và nhấp vào gửi. Ngày gửi, tôi muốn lưu tài liệu trong RavenDB và sau đó lấy nó cho mục đích tải xuống. Tôi nhìn thấy liên kết này http://ravendb.net/docs/client-api/attachments nói rằng .. làm điều này ..

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

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

Tôi không sau những gì 1,2,3 nghĩa là ở đây và những gì nó có nghĩa là để nói video/2 trong lệnh ... làm thế nào tôi có thể sử dụng hai dòng này để sử dụng nó trong trường hợp của tôi .. để lưu từ/pdf trong ravendb .. nếu có ai đã làm điều đó trước đây, xin vui lòng tư vấn cho.

Tôi không rõ ràng về một điều .. cách tệp đính kèm được lưu trữ. Nếu tôi muốn lưu trữ các tập tin đính kèm chính nó (nói pdf) nó được lưu trữ độc lập trong ravendb .. và tôi chỉ lưu trữ chìa khóa của tập tin đính kèm trong tài liệu chính mà nó được liên kết với? Nếu đó là như vậy, pdf ở đâu được lưu trữ trong ravendb? Tôi có thể xem nó không?

Trả lời

11

1,2,3 chỉ là dữ liệu mẫu. Những gì nó đang cố gắng để vượt qua là bạn tạo ra một dòng bộ nhớ của bất cứ điều gì bạn muốn sau đó sử dụng dòng bộ nhớ trong phương pháp PutAttachment. Dưới đây là ad-hoc và không được kiểm tra nhưng nên làm việc:

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

Edited cho phần còn lại của câu hỏi

  1. như thế nào tập tin đính kèm được lưu trữ? Tôi tin rằng đó là tài liệu json với một thuộc tính đang giữ mảng byte của tệp đính kèm
  2. Tài liệu "được lưu trữ độc lập?" Vâng. Tệp đính kèm là một tài liệu đặc biệt không được lập chỉ mục nhưng nó là một phần của cơ sở dữ liệu để các tác vụ như công việc sao chép.
  3. "Tôi có nên" lưu trữ khóa của tệp đính kèm trong tài liệu chính được liên kết không? Có, bạn sẽ tham khảo Key và bất cứ lúc nào bạn muốn nhận được rằng bạn sẽ chỉ yêu cầu Raven cho tập tin đính kèm với id đó.
  4. pdf có được lưu trữ trên thực tế bằng ravendb không? Vâng.
  5. Bạn có thấy không? Số Nó thậm chí xuất hiện trong studio (ít nhất là như xa như tôi biết)

Sửa Corrected và cập nhật mẫu

 [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

Vậy làm thế nào bạn sẽ tải lên một pdf ví dụ .. như trong OP của tôi. – ZVenue

+0

Nếu nó không hiển thị trong studio .. làm thế nào để tôi biết nó có – ZVenue

+0

Cảm ơn bạn đã trả lời đã chỉnh sửa. Câu hỏi của tôi từ mã .. Tôi không thấy làm thế nào tôi có thể nhận được các tập tin pdf tôi chọn từ kiểm soát tập tin html vào RavenDB. tôi đang đi đâu .. Tôi không thấy điều đó. – ZVenue

8
  • như thế nào tập tin đính kèm được lưu trữ?

Nó được lưu trữ dưới dạng dữ liệu nhị phân bên trong RavenDB. Nó không được lưu trữ như json.

  • Tài liệu "được lưu trữ độc lập?

Không có tài liệu ở đây, bạn có một số siêu dữ liệu được liên kết với tệp đính kèm, nó không phải là tài liệu seaprate.

  • "Tôi có nên" lưu trữ khóa của tệp đính kèm trong tài liệu chính được liên kết không?

Có, không có cách nào để truy vấn.

  • pdf có được lưu trữ trên đĩa ravendb không?

  • Bạn có thể nhìn thấy nó?

Chỉ khi bạn đi đến tập tin đính kèm trực tiếp, chẳng hạn như http://localhost:8080/static/ATTACHMENT_KEY

Nó sẽ không hiển thị trong giao diện người dùng

+0

Nếu đó là tài liệu riêng tư, tôi có muốn sử dụng tệp đính kèm không? Người khác sẽ có thể truy cập vào nó? – asunrey

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