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 の意味と、コマンドで videos/2 と言う意味を理解していません。 . 誰かが以前にそのようなことをしたことがある場合は、アドバイスしてください.

一つはっきりしないのは、添付ファイルがどのように保存されているかです。添付ファイル自体 (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. 添付ファイルはどのように保存されますか? 添付ファイルのバイト配列を保持する 1 つのプロパティを持つ json ドキュメントだと思います
  2. 「ドキュメント」は独立して保存されていますか?はい。添付ファイルは、索引付けされていない特別なドキュメントですが、データベースの一部であるため、複製などのタスクが機能します。
  3. 添付ファイルのキーは、関連付けられているメイン ドキュメントに保存する必要がありますか? はい、キーを参照し、それを取得したいときはいつでも、その ID の添付ファイルを Raven に要求するだけです。
  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 に答える