2012-08-01 21 views
1

我正在尝试做什么 - 当用户单击链接时,从RavenDB获取附件并自动为用户打开它。在ASP.NET MVC的用户界面中为用户打开附件

单击链接 - 我通过view/ajax将附件的附件标识(已保存在RavenDB中)传递给控制器​​方法。一旦进入控制器方法,我想获取附件并显示/打开用户的附件。

查看:

<a href onclick="GetAttachment('<%= Model.Id %>');"> See attachment </a> 

阿贾克斯/ JS

function GetAttachment(id) { 

$.ajax({ 
    type: 'POST', 
    url: '/ControllerName/GetMethod', 
    data: id, 
    contentType: 'application/json; charset=utf-8', 
    success: function (msg) { 
     if (msg.Success) {    
     } 
     else {    
     } 
    }  
    }); 
} 

控制器:

public string GetMethod(string id) 
    {   
     var dbCommands = session.Advanced.DatabaseCommands; 
     var attachment = dbCommands.GetAttachment(id); 
     //Here - How do I use above lines of code to get hold of the 
     // attachment and open it for the user. 
    } 

谢谢你的帮助。

+0

什么是附件类型?它是流还是其他?在所有情况下,您需要从Action中返回FileResult。 – 2012-08-01 14:41:24

+0

保存其转换成流..并保存为字节信息..它可以是任何类型的文件.. .pdf或.doc等 – ZVenue 2012-08-01 14:43:34

回答

1

像这样: 控制器:

public FileResult GetMethod(string id) 
{   
    var name = "filename.extension"; 
    var dbCommands = session.Advanced.DatabaseCommands; 
    var attachment = dbCommands.GetAttachment(id); 
    var stream = new MemoryStream(attachment.Data); 
    return new FileStreamResult(stream, name); 
} 

检视:

@ Html.ActionLink( “见附件”, “GetMethod”, “ControllerName”,新的{ID = ModelId} ,NULL)

你需要从数据库中获取文件的MemoryStream或者您的文件转移到MemoryStream的

+0

MemoryStream附件= dbCommands.GetAttachment(id);将不会作为“dbCommands.GetAttachment(id)”不是内存类型..它是raven.abstractions.data.attachment类型.. – ZVenue 2012-08-01 16:59:05

+0

我不知道你从数据库中得到什么。但你需要将它传递到MemoryStream传递给FileStreamResult – 2012-08-01 17:04:27

+1

我更新答案将您的附件转移到流 – 2012-08-01 17:14:12

3

RavenDB Attachment类具有Data类型Func<Stream>的属性,该属性是thunk到附件的字节流。该流是您需要在您的MVC控制器中返回的内容:

public FileResult GetMethod(string id) 
{   
    var dbCommands = session.Advanced.DatabaseCommands; 
    var attachment = dbCommands.GetAttachment(id); 
    return File(attachment.Data(), "fileName"); 
} 
+0

错误..貌似。 “文件是一种类型,用作变量”... – ZVenue 2012-08-02 13:03:03

+0

此方法应该在您的MVC控制器中。 – eulerfx 2012-08-02 16:29:26