繁体   English   中英

实体框架4和sql filestream从db读取文件

[英]Entity framework 4 and sql filestream to read a file from db

我在SQL 2008中使用ASP.NET 4,EF 4和FILESTREAM向数据库添加/读取文件。 我可以上载文件,但无法以我想要的方式检索文件。 这是我在做什么-

  1. 我有一个显示文件列表的网格。 每个订单项都是一个设置了CommandName和CommandArgument的文件。
  2. 用户单击这些文件中的任何一个,我就会在RowCommand事件中捕获该事件。 此时,我获得了文件的ID,并从数据库中检索了byte []。 如何显示标准下载框供用户保存或取消下载?

我可以将流写入临时文件(使用System.IO.File.WriteAllBytes),然后将Server.Transfer传输到临时文件,但我认为这是不必要的步骤。 有没有办法,我可以直接将字节读取到内存中,然后设置ContentType / MimeType并允许用户保存文件?

我知道使用T-SQL访问FILESTREAM文件要比使用WIN32 API(使用新的SystemFile.PathName()和Impersonation的组合)访问文件更慢,但是EF4使使用SQL的速度更快,所以我走了这条路。

这是代码-

var file = db.Storage.Single(f => f.ID.Equals(fileID)); // fileID is set in CommandArgument
// file.Contents has the byte [].
// display a  standard file download box.

谢谢你的帮助!

您可能要创建一个.ashx处理程序(假设您正在使用asp),并创建到该URL的Server.Transfer()或Server.Redirect()。

或者,您可以更改GridView以显示指向处理程序URL的超链接。

右键单击解决方案资源管理器>新建项目> ASP.Net Hanlder。

处理程序代码:

public class DownloadFile : IHttpHandler { // add IRequiresSessionState if needed 
  public bool IsReusable { get { return true; } }

  public void ProcessRequest(HttpContext context) {
    var fileID = context.Request.QueryString["fileID"]; // assuming fileID is a string
    var file = db.Storage.Single(f => f.ID.Equals(fileID)); 
    // set the content type
    context.Response.OutputStream.Write(file.Contents, 0, file.Contents.Length);
  }
}

您可能还想添加一些错误检查。

您的URL可能是这样的: /DownloadFile.ashx?fileID=somefileid

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM