【问题标题】:Entity framework 4 and sql filestream to read a file from db实体框架 4 和 sql 文件流从 db 读取文件
【发布时间】:2010-09-15 20:37:30
【问题描述】:

我在 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.

感谢您的帮助!

【问题讨论】:

    标签: sql entity-framework-4 filestream


    【解决方案1】:

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

    或者,您也可以更改 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);
      }
    }
    

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

    您的网址应该是这样的:/DownloadFile.ashx?fileID=somefileid

    【讨论】:

    • 是的,我正在使用 ASP.NET(使用此信息更新了问题)。你在说什么网址?我只有字节。您要我将字节写入文件并重定向到该文件吗?如果是这样,我会尽量避免这条路线,因为我认为这可能是必要的。
    • 无需写入文件,直接写入OutputStream即可。我添加了代码以更好地说明这一点。
    • 我想我明白你在说什么。该链接将类似于 /GetFile.ashx?id={ID},处理程序将从 DB 读取字节并将字节直接写入响应流而不保存到磁盘?
    • 感谢代码示例,我会试一试并报告。
    • 没错。还应该让你的网格更简单一些。
    猜你喜欢
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2012-11-28
    • 2015-05-17
    相关资源
    最近更新 更多