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 |
我不遵循1,2,3这里的意思以及在命令中说视频/ 2意味着什么...我如何在我的情况下使用这两行来保存word / pdf在ravendb中。 如果有人以前做过这样的事情,请告知。
我不清楚一件事......附件是如何存储的。 如果我想存储附件本身(比如pdf),它会独立存储在ravendb ..我只是将附件的密钥存储在与之关联的主文档中? 如果是这样的话,pdf在物理上存储在ravendb中的哪个位置? 我可以看吗?
1,2,3只是示例数据。它试图获得的是你创建一个你想要的内存流然后在PutAttachment方法中使用该内存流。以下是临时的,未经测试但应该有效:
1 2 3 4 5 6 7 8 9 |
编辑了其余的问题
编辑已更正和更新的示例
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中?
是
- 你能看见它吗?
仅当您直接转到附件时,例如
它不会在UI中显示