下载大文件,保存在数据库中

2023-12-21

我们有很多文件,以二进制形式保存在 SQL Server 数据库中。 我制作了一个 .ashx 文件,将这些文件传递给用户。 不幸的是,当文件变得相当大时,它会失败,并出现以下错误:

算术运算中的上溢或下溢

当我将二进制文件加载到 byte[] 中时,我假设它耗尽了内存。

所以,我的问题是,当它来自数据库表时,如何实现此功能,以块形式读取(也许?)? Response.TransmitFile() 似乎也是一个不错的选择,但同样,这将如何与数据库一起使用?

下面代码中的 DB.GetReposFile() 从数据库获取文件。有多个字段用于输入: 文件名、内容类型、日期戳和 varbinary 形式的 FileContent。

这是我的功能,传递文件:

context.Response.Clear();
try
{
    if (!String.IsNullOrEmpty(context.Request.QueryString["id"]))
    {
        int id = Int32.Parse(context.Request.QueryString["id"]);
        DataTable dtbl = DB.GetReposFile(id);
        string FileName = dtbl.Rows[0]["FileName"].ToString();
        string Extension = FileName.Substring(FileName.LastIndexOf('.')).ToLower();
        context.Response.ContentType = ReturnExtension(Extension);
        context.Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName);

        byte[] buffer = (byte[])dtbl.Rows[0]["FileContent"];
        context.Response.OutputStream.Write(buffer, 0, buffer.Length);
    }
    else
    {
        context.Response.ContentType = "text/html";
        context.Response.Write("<p>Need a valid id</p>");
    }
}
catch (Exception ex)
{
    context.Response.ContentType = "text/html";
    context.Response.Write("<p>" + ex.ToString() + "</p>");
}

Update:我最终得到的功能如下所列。 正如 Tim 提到的,DB.GetReposFileSize() 只是获取内容数据长度。 我在原始代码中调用此函数,而不是这两行:

byte[] buffer = (byte[])dtbl.Rows[0]["FileContent"];
context.Response.OutputStream.Write(buffer, 0, buffer.Length);

新的下载功能:

private void GetFileInChunks(HttpContext context, int ID)
    {
        //string path = @"c:\somefile.txt";
        //FileInfo file = new FileInfo(path);
        int len = DB.GetReposFileSize(ID);
        context.Response.AppendHeader("content-length", len.ToString());
        context.Response.Buffer = false;


        //Stream outStream = (Stream)context.Response.OutputStream;

        SqlConnection conn = null;
        string strSQL = "select FileContent from LM_FileUploads where ID=@ID";
        try
        {
            DB.OpenDB(ref conn, DB.DatabaseConnection.PDM);
            SqlCommand cmd = new SqlCommand(strSQL, conn);
            cmd.Parameters.AddWithValue("@ID", ID);

            SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
            reader.Read();
            byte[] buffer = new byte[1024];
            int bytes;
            long offset = 0;

            while ((bytes = (int)reader.GetBytes(0, offset, buffer, 0, buffer.Length)) > 0)
            {
                // TODO: do something with `bytes` bytes from `buffer`
                context.Response.OutputStream.Write(buffer, 0, buffer.Length);

                offset += bytes;
            }
        }

        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            DB.CloseDB(ref conn);
        }
    }

您可以使用DATALENGTH http://msdn.microsoft.com/en-us/library/ms173486.aspx得到的大小VARBINARY并例如使用SqldataReader这是Read http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.read.aspx-or ReadBytes http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getbytes-Method.

看一下这个答案以查看实现:在 ASP.NET 中流式传输文件的最佳方式 https://stackoverflow.com/questions/608480/best-way-to-stream-files-in-asp-net/609151#609151

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

下载大文件,保存在数据库中 的相关文章

随机推荐

  • 更改后重新处理请求

    我正在尝试使用passport js以通用方式 在调用之前更改配置authenticate 但我找不到之后将请求重定向到它的方法 我这样处理请求 入口点 app get authorize clientId network authUtil
  • zmq::message_t发送后可以重复使用吗?

    我正在使用 ZeroMQ 来实现一个玩具通信协议 这是我第一次使用这个框架 库 现在 在我的协议中 某一方发送多个连续消息 所有消息都具有相同的大小 所以 我想 我会避免重新分配它们 而只是尝试用不同的内容重新填充消息数据缓冲区 例如 zm
  • 从 python 嵌套列表在 pandas 中创建新列

    我有一个熊猫数据框 其中一列有一个嵌套列表 我想从嵌套列表创建新列 Example L 1 2 4 5 6 7 8 9 3 5 我希望嵌套列表中的所有元素都作为列 如果列表有该元素 则该值应为 1 如果没有 则该值应为零 1 2 4 5 6
  • SDK 错误:0x8D07,在 C# 中使用 Canon SDK 时

    我只下载源教程here http www codeproject com Articles 688276 Canon EDSDK Tutorial in Csharp 当我连接佳能 70D 运行它时 出现以下错误 我错过了什么重点 错误 错
  • ajax请求时禁用按钮

    我编写了一条指令 有助于在 ajax 请求挂起时禁用按钮 这是我的指令 directive requestPending http function http return restrict A scope requestPending l
  • 如何检查数组是否为空或存在?

    第一次加载页面时 我需要检查是否有图像image array并加载最后一张图像 否则 我禁用预览按钮 提醒用户按下新图像按钮并创建一个空数组来放置图像 问题是image array in the else一直开火 如果数组存在 它只是覆盖它
  • vim 中的向后杀字?

    是返回并删除一个词的最快方法Esc or Ctrl and db 我想我搞砸了很多 P 并且习惯了使用M
  • Spring Boot - 自动装配数据源 Bean

    我有一个基本的 Spring Boot 应用程序 注释如下 SpringBootApplication public class ApiApplication public static void main String args Spri
  • java Finals 是否有助于编译器创建更高效​​的字节码? [复制]

    这个问题在这里已经有答案了 可能的重复 Java中使用final关键字会提高性能吗 https stackoverflow com questions 4279420 does use of final keyword in java im
  • 获取 Facebook 页面拥有的事件列表

    有谁知道如何获取 Facebook 页面拥有 创建 的活动列表 我似乎能够使用 graph api 来生成实体参加的事件列表 我还查看了 FQL 但它似乎要求 where 子句是可索引字段 当然 id 是唯一可索引字段 为了获得奖励积分 我
  • vista有没有API来检测桌面是否全屏运行?

    例如 用户是否全屏播放电影 或者以全屏模式查看 powerpoint 我发誓我以前见过 IsFullScreen Interactive API 但现在找不到它 我是这样解决这个问题的 using System using System C
  • 将 Java 系统退出值返回到 bash 脚本

    我正在尝试从 java 程序获取返回值 System exit 1 到 shell 脚本中 但它似乎返回 jvm 退出代码 如果它不崩溃 则该代码始终为 0 出于测试目的 这是我的 main 中的第一行 有人知道怎么做吗 我的bash代码
  • SELECT COUNT(*) - 如果没有匹配的行,则返回 0 以及分组字段

    我有以下查询 SELECT employee department count AS sum FROM items WHERE employee 1 AND department 2 OR employee 3 AND department
  • asyncore python 挂起

    我尝试使用 asyncore 做简单的异步 http 客户端 这段代码工作正常并且输出 足够快 www gmail com recv http code 301 www yandex ru recv http code 200 www py
  • 重复一段代码固定次数

    我试图在不使用条件的情况下重复一段代码 但仍然只重复特定次数 基本上是这样的 repeat 50 Do stuff here 有没有办法做到这一点 除了复制粘贴50次之外 我这样做是因为我想如果我知道我想重复某件事多少次 它会比每次都检查条
  • 使用双指针进行动态分配

    我有一个基类 Toy 和派生类 Toy remote car amd Toy battery car 我正在这样做 Toy ptr ptr new Toy ptr 0 new Toy remote car 1 ptr 1 new Toy b
  • 为什么material-ui占用太多空间?

    我正在使用 webpack 来捆绑我的 React 项目 我的项目依赖于以下组件的material ui material ui Dialog material ui styles getMuiTheme material ui style
  • Kotlinx 序列化,避免其他数据类型崩溃

    我在应用程序中使用外部 API 而反序列化是使用 Kotlinx 序列化包完成的 当 api 结果是多个值的 Int 数组和单个值的原始 int 时 我遇到问题 我怎样才能避免在此过程中崩溃 是否有更好的方法来避免崩溃或创建数据类 ex i
  • 如何从 Rails Integration Test 访问会话?

    考虑以下集成测试 test if there is no user in session redirect to index and flash message do open session do sess post login emai
  • 下载大文件,保存在数据库中

    我们有很多文件 以二进制形式保存在 SQL Server 数据库中 我制作了一个 ashx 文件 将这些文件传递给用户 不幸的是 当文件变得相当大时 它会失败 并出现以下错误 算术运算中的上溢或下溢 当我将二进制文件加载到 byte 中时