当前位置: 首页 > 编程语言 > C#

下载大文件,保存到数据库分享

时间:2023-04-11 00:18:56 C#

下载大文件,保存到数据库我们有很多文件,在SQLServer数据库中保存为二进制文件。我已发送.ashx文件以将这些文件传送给用户。不幸的是,当文件变得相当大时,它会失败并出现以下错误:算术运算中溢出或下溢我假设它用完了内存,因为我正在将二进制文件加载到字节[]中。所以,我的问题是,当它来自数据库表时,我如何创建这个函数来读取块(也许?)?Response.TransmitFile()似乎是一个不错的选择,但同样,如何使用数据库?DB.GetReposFile()在下面的代码中从数据库中获取文件。条目有各种字段:文件名、内容类型、日期戳和FileContent作为varbinary。这是我的功能,提供文件:context.Response.Clear();尝试{如果(!String.IsNullOrEmpty(context.Request.QueryString["id"])){intid=Int32.Parse(context.Request.QueryString["id"]);DataTabledtbl=DB.GetReposFile(id);字符串FileName=dtbl.Rows[0]["FileName"].ToString();字符串扩展=FileName.Substring(FileName.LastIndexOf('.')).ToLower();context.Response.ContentType=ReturnExtension(扩展名);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("需要一个有效的id");}}catch(Exceptionex){context.Response.ContentType="text/html";context.Response.Write(""+ex.ToString()+"");}更新:我最后得到的函数是下面列出的函数。Tim提到,DB.GetReposFileSize()只获取内容数据长度。我在原始代码中调用这个函数,而不是这两个行:byte[]buffer=(byte[])dtbl.Rows[0]["FileContent"];context.Response.OutputStream.Write(buffer,0,buffer.Length);新下载函数:privatevoidGetFileInChunks(HttpContextcontext,intID){//stringpath=@"c:somefile.txt";//文件信息file=new文件信息(路径);intlen=DB.GetReposFileSize(ID);context.Response.AppendHeader("内容长度",len.ToString());context.Response.Buffer=false;//流outStream=(Stream)context.Response.OutputStream;SqlConnectionconn=null;stringstrSQL="从LM_FileUploads中选择FileContent,其中ID=@ID";尝试{DB.OpenDB(refconn,DB.DatabaseConnection.PDM);SqlCommandcmd=newSqlCommand(strSQL,conn);cmd.Parameters.AddWithValue("@ID",ID);SqlDataReader阅读器=cmd.ExecuteReader(CommandBehavior.SequentialAccess);读者。阅读();字节[]缓冲区=新字节[1024];整数字节;长偏移量=0;while((bytes=(int)reader.GetBytes(0,offset,buffer,0,buffer.Length))>0){//TO做:用来自`buffer`context.Response.OutputStream.Write(buffer,0,buffer.Length)的`bytes`字节做一些事情;偏移量+=字节;}}catch(Exceptionex){抛出ex;}最后{DB.CloseDB(refconn);您可以使用DATALENGTH获取VARBINARY的大小并使用SqldataReader流式传输它并使用Read-或ReadBytes查看此答案以查看实现:在ASP.NET中流式传输文件上面的最佳方法是C#学习教程:下载一个大文件并将共享的所有内容保存在数据库中。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: