我有一个文件输入控制。
<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 ...我如何使用这两条线来使用它在我的情况..保存字/ PDF文件中ravendb。 。如果有一个人做过这样的事情,请大家指教。
我不是一件事附件..如何存储清楚。 如果我要保存附件本身(比如PDF)它是独立存储在ravendb ..我只是存储,这与相关的主要文档附件的关键? 如果是这样的话,哪里是物理存储在ravendb的PDF? 我可以看吗?
的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" }
});
}
编辑为剩余的问题
- 如何保存附件? 我相信这是与一个属性保持附件的字节数组JSON文档
- 在“文件”独立存储? 是。 附件是没有索引的特殊文件,但它是数据库的一部分,因此,像复制的工作任务。
- “我应该”存储,这与相关的主要文件附件的关键? 是的,你会引用密钥和任何时候你想,你会只问乌鸦与该ID的附件。
- 物理存储在ravendb的PDF? 是。
- 你能看见它吗? 号它在工作室甚至出现(至少据我所知)
编辑修正和更新的样本
[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文件。
是的,有没有办法查询了点。
是
只有当你去直接连接,如http://localhost:8080/static/ATTACHMENT_KEY
它不会显示在UI