关于c#:RavenDB附件 – 功能怎么办?

RavenDB Attachments - Functionality how to do?

我有一个文件输入控件。

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

让我们说我浏览到C:/Instruction.pdf文档并单击提交。 在提交时,我想将文档保存在RavenDB中,稍后将其检索以供下载。 我看到了这个链接http://ravendb.net/docs/client-api/attachments
那说..做这个..

1
2
3
4
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 / pdf在ravendb中。 如果有人以前做过这样的事情,请告知。

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


1,2,3只是示例数据。它试图获得的是你创建一个你想要的内存流然后在PutAttachment方法中使用该内存流。以下是临时的,未经测试但应该有效:

1
2
3
4
5
6
7
8
9
        using (var mem = new MemoryStream(file.InputStream)
        {
            _documentStore.DatabaseCommands.PutAttachment("upload/" + YourUID, null, mem,
                                                          new RavenJObject
                                                              {
                                                                  {"OtherData","Can Go here" },
                                                                  {"MoreData","Here" }
                                                              });
        }

编辑了其余的问题

  • 如何存储附件?我相信它是一个json文档,其中一个属性包含附件的字节数组
  • "文件"是否独立存储?是。附件是一个未编制索引的特殊文档,但它是数据库的一部分,因此复制等任务可以正常工作。
  • "我应该"将附件的密钥存储在与其关联的主文档中吗?是的,您会引用密钥,并且只要您想要获得该密钥,您就可以向Raven询问具有该ID的附件。
  • pdf是否实际存储在ravendb中?是。
  • 你能看见它吗?不,它甚至出现在工作室里(至少据我所知)
  • 编辑已更正和更新的示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
            [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();
            }
        }


    • 如何存储附件?

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

    • "文件"是否独立存储?

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

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

    是的,没有办法查询。

    • pdf是否实际存储在ravendb中?

    • 你能看见它吗?

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

    它不会在UI中显示