2012-07-12 25 views
8

Tengo un control de entrada de archivo.Attachments RavenDB - Funcionalidad de cómo hacerlo?

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

digamos que hojeo a C: /Instruction.pdf documento y haga clic en enviar. En Enviar, quiero guardar el documento en RavenDB y luego recuperarlo para descargarlo. Vi este enlace http://ravendb.net/docs/client-api/attachments que dice .. hacer esto ..

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

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

estoy siguiendo lo que significa 1,2,3 aquí y lo que significa decir vídeos/2 en el comando ... cómo me puedo usar estas dos líneas para usarlo en mi caso ... para guardar word/pdfs en ravendb ... si alguien lo ha hecho antes, por favor avise.

No tengo claro una cosa ... cómo se almacena el archivo adjunto. Si quiero almacenar el archivo adjunto (por ejemplo, PDF), se almacena de forma independiente en ravendb ... y simplemente guardo la clave del archivo adjunto en el documento principal al que está asociada. Si es así, ¿dónde está el pdf almacenado físicamente en ravendb? ¿puedo verlo?

Respuesta

11

El 1,2,3 es solo un ejemplo de datos. Lo que está tratando de transmitir es que cree una secuencia de memoria de lo que quiera y luego use esa secuencia de memoria en el método PutAttachment. A continuación se muestra ad hoc y no probado, pero debería funcionar:

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

Editado por el resto de las preguntas

  1. ¿Cómo se almacena el apego? Creo que es un documento json con una propiedad que contiene la matriz de bytes del archivo adjunto
  2. ¿El "documento" se almacena de forma independiente? Sí. Un archivo adjunto es un documento especial que no está indexado pero forma parte de la base de datos para que las tareas como la replicación funcionen.
  3. "¿Debo" guardar la clave del archivo adjunto en el documento principal al que está asociada? Sí, haría referencia a la Clave y, en cualquier momento que quiera obtenerla, le pediría a Raven el archivo adjunto con esa identificación.
  4. ¿El PDF se almacena físicamente en ravendb? Sí.
  5. ¿Lo ve? No, ni siquiera aparece en el estudio (al menos por lo que yo sé)

Editar corregidos y actualizados Muestra

 [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

Entonces, ¿cómo cargar un pdf por ejemplo .. como en mi OP. – ZVenue

+0

Si no aparece en el estudio ... ¿cómo sé si está allí? – ZVenue

+0

Gracias por la respuesta editada. Mi pregunta del código ... No veo cómo puedo obtener el archivo pdf que elijo del control de archivos html en RavenDB. ¿Dónde estoy pasando eso? No veo eso. – ZVenue

8
  • ¿Cómo se almacena el apego?

Se almacena como datos binarios dentro de RavenDB. NO se almacena como json.

  • ¿El documento está almacenado de forma independiente?

No hay un documento aquí, tiene algunos metadatos que están asociados con el archivo adjunto, no es un documento de SeaPrate.

  • "¿Debo" guardar la clave del archivo adjunto en el documento principal al que está asociada?

Sí, no hay forma de consultar eso.

  • ¿El pdf está almacenado físicamente en ravendb?

  • ¿puedes verlo?

Sólo si vas a la fijación directa, tales como http://localhost:8080/static/ATTACHMENT_KEY

No se mostrará en la interfaz de usuario

+0

Si es un documento privado, ¿deseo utilizar el archivo adjunto? ¿Podrán otras personas acceder a él? – asunrey