使数据库大字段的 Server Side ASP.Net Web/Http 下载,支持 FlashGet (Client) 断点续传多线程下载...

今天看了 bestcomy 的
例程:ASP.NET实现从MSSQL中分块断点续传下载image字段内容
http://www.cnblogs.com/bestcomy/archive/2005/05/08/150815.html

不过代码复杂了些!

这里请大家参阅:
ms-help://MS.NETFrameworkSDKv1.1.CHS/cpref/html/frlrfSystemDataCommandBehaviorClassTopic.htm
注意:
SequentialAccess
 提供一种方法,以便 DataReader 处理包含带有大二进制值的列的行。SequentialAccess 不是加载整行,而是使 DataReader 将数据作为流来加载。然后可以使用 GetBytes 或 GetChars 方法来指定开始读取操作的字节位置以及正在返回的数据的有限的缓冲区大小。
当指定 SequentialAccess 时,尽管无需读取每个列,但是需要按照列的返回顺序读取它们。一旦已经读过返回的数据流中某个位置的内容,就不能再从 DataReader 中读取该位置或该位置之前的数据。当使用 OleDbDataReader 时,可重新读取当前列的值,直到读过它。当使用 SqlDataReader 时,一次只能读取一个列值。

关于如何支持 FlashGet 断点续传多线程下载请参阅:
 http://blog.csdn.net/playyuer/archive/2004/08/02/58281.aspx
 http://blog.csdn.net/playyuer/archive/2004/08/02/58430.aspx

因此代码可以更简单些,支持 Oracle 也不会太难:
1. BlobDownload.aspx 前代码(HTML)

ExpandedBlockStart.gif ContractedBlock.gif <% dot.gif @ Page language="c#" Codebehind="BlobDownload.aspx.cs" AutoEventWireup="false" Inherits="BlobDownload"  %>
None.gif
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"  >
None.gif
< HTML >
None.gif    
< HEAD >
None.gif        
< title > WebForm1 </ title >
None.gif        
< meta  name ="GENERATOR"  Content ="Microsoft Visual Studio .NET 7.1" >
None.gif        
< meta  name ="CODE_LANGUAGE"  Content ="C#" >
None.gif        
< meta  name ="vs_defaultClientScript"  content ="JavaScript" >
None.gif        
< meta  name ="vs_targetSchema"  content ="http://schemas.microsoft.com/intellisense/ie5" >
None.gif    
</ HEAD >
None.gif    
< body  MS_POSITIONING ="GridLayout" >
None.gif        
< form  id ="Form1"  method ="post"  runat ="server" >
None.gif        
</ form >
None.gif    
</ body >
None.gif
</ HTML >


2. BlobDownload.aspx 后代码 BlobDownload.aspx.cs

None.gif using  System;
None.gif
using  System.Data;
None.gif
using  System.Data.SqlClient;
None.gif
None.gif
// namespace Microshaoft
None.gif
// {
ExpandedBlockStart.gifContractedBlock.gif
     /**/ /// <summary>
InBlock.gif    
/// WebForm1 的摘要说明。
ExpandedBlockEnd.gif    
/// </summary>

None.gif      public   class  BlobDownload : System.Web.UI.Page
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
private void Page_Load(object sender, System.EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//Sql*** 以后换成 Oracle*** 估计就可以实现支持 Oracle 了
InBlock.gif
            SqlConnection scn = new SqlConnection(@"Data Source=SERVER\PSQLKE;Initial Catalog=northwind;user id=sa");
InBlock.gif            
//字段顺序不要错
InBlock.gif
            SqlCommand scmd = new SqlCommand("SELECT categoryName,DataLength(Picture),Picture FROM Categories where categoryName='Test'", scn);
InBlock.gif            scn.Open();
InBlock.gif            SqlDataReader sdr 
= scmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult);
InBlock.gif            
if (sdr.Read()) //只读取一条记录
ExpandedSubBlockStart.gifContractedSubBlock.gif
            dot.gif{
InBlock.gif                
try
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
string FileName = sdr.GetString(0);//FileName
InBlock.gif
                    Response.AddHeader("Content-Disposition""attachment; filename=" + FileName + ".rar");
InBlock.gif
InBlock.gif                    
int size = 64 * 1024//buffer size
InBlock.gif
                    byte[] bytes = new byte[size];
InBlock.gif
InBlock.gif                    
long l = sdr.GetInt32(1);//DataLength
InBlock.gif
                    long p = 0;
InBlock.gif                    Response.AddHeader(
"Accept-Ranges""bytes");
InBlock.gif                    
if (Request.Headers["Range"!= null)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        Response.StatusCode 
= 206;
InBlock.gif                        p 
= long.Parse( Request.Headers["Range"].Replace("bytes=","").Replace("-",""));
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    Response.AddHeader(
"Content-Length", ((long)(l - p)).ToString()); 
InBlock.gif                    
if (p != 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
//不是从最开始下载,
InBlock.gif                        
//响应的格式是:
InBlock.gif                        
//Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]/[文件的总大小]
InBlock.gif
                        Response.AddHeader("Content-Range","bytes " + p.ToString() + "-" + ((long)(l - p)).ToString() + "/" + l.ToString());
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    
long r = sdr.GetBytes(2, p, bytes, 0, bytes.Length);
InBlock.gif                    
while (r == size)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        Response.OutputStream.Write(bytes,
0,(int) r);
InBlock.gif                        p 
+= size;
InBlock.gif                        r 
= sdr.GetBytes(2, p, bytes, 0, size);
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    Response.OutputStream.Write(bytes,
0,(int) r);
ExpandedSubBlockEnd.gif                }

InBlock.gif                
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    sdr.Close();
InBlock.gif                    scn.Close();
InBlock.gif                    Response.End();
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                Response.Write(
"Error: can not download your request");
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
InBlock.gif        
override protected void OnInit(EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//
InBlock.gif            
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
InBlock.gif            
//
InBlock.gif
            InitializeComponent();
InBlock.gif            
base.OnInit(e);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
InBlock.gif        
/// 此方法的内容。
ExpandedSubBlockEnd.gif        
/// </summary>

InBlock.gif        private void InitializeComponent()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
this.Load += new System.EventHandler(this.Page_Load);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif        
#endregion

ExpandedBlockEnd.gif    }

None.gif
// }
None.gif


另外还有一个:
.Net/C#: 实现支持断点续传多线程下载的 Http Web 客户端工具类 (第2版) (C# DIY HttpWebClient)
http://www.cnblogs.com/microshaoft/archive/2005/03/21/122645.aspx

经测试也已可成功下载,如下测试URL:
http://localhost/myasp.net/blobdownload.aspx

转载于:https://www.cnblogs.com/Microshaoft/archive/2005/05/08/151093.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值