8

我有一个文件输入控件。

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

假设我浏览到C:/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 的含义...如何在我的情况下使用这两行来使用它.. 将 word/pdfs 保存在 ravendb 中。 .如果有人以前做过这样的事情,请指教。

我不清楚一件事..附件是如何存储的。如果我想存储附件本身(比如 pdf),它会独立存储在 ravendb 中。我只是将附件的密钥存储在与之关联的主文档中?如果是这样,那么 pdf 物理存储在 ravendb 的什么位置?我可以看吗?

4

2 回答 2

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. 附件是如何存储的?我相信这是一个 json 文档,其中一个属性保存附件的字节数组
  2. “文档”是独立存储的吗?是的。附件是一个特殊的文档,它没有被索引,但它是数据库的一部分,因此复制之类的任务可以工作。
  3. “我应该”将附件的密钥存储在与之关联的主文档中吗?是的,您会引用密钥,并且任何时候您想获得它,您只需向 Raven 索要具有该 ID 的附件。
  4. pdf 是否物理存储在 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();
        }
    }
于 2012-07-12T18:35:41.623 回答
8
  • 附件是如何存储的?

它作为二进制数据存储在 RavenDB 中。它不存储为 json。

  • “文档”是独立存储的吗?

这里没有文档,您有一些与附件关联的元数据,它不是单独的文档。

  • “我应该”将附件的密钥存储在与之关联的主文档中吗?

是的,没有办法查询。

  • pdf 是否物理存储在 ravendb 中?

是的

  • 你能看见它吗?

仅当您直接进入附件时,例如http://localhost:8080/static/ATTACHMENT_KEY

它不会显示在 UI 中

于 2012-07-13T08:18:57.807 回答