System.IO.Stream iStream = null; // Buffer to read 10K bytes in chunk: byte[] buffer = new Byte[10240]; // Length of the file: int length; // Total bytes to read: long dataToRead; // Identify the file to download including its path. string filepath = @"E:\software\SQL Server 2000 Personal Edition.ISO"; // Identify the file name. string filename = System.IO.Path.GetFileName(filepath); try { // Open the file. iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read,System.IO.FileShare.Read); Response.Clear(); // Total bytes to read: dataToRead = iStream.Length; long p = 0; if(Request.Headers["Range"]!=null) { Response.StatusCode = 206; p = long.Parse( Request.Headers["Range"].Replace("bytes=","").Replace("-","")); } if(p != 0) { Response.AddHeader("Content-Range","bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString()); } Response.AddHeader("Content-Length",((long)(dataToRead-p)).ToString()); Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(Request.ContentEncoding.GetBytes(filename))); iStream.Position = p; dataToRead = dataToRead - p; // Read the bytes. while (dataToRead > 0) { // Verify that the client is connected. if (Response.IsClientConnected) { // Read the data in buffer. length = iStream.Read(buffer, 0, 10240); // Write the data to the current output stream. Response.OutputStream.Write(buffer, 0, length); // Flush the data to the HTML output. Response.Flush(); buffer= new Byte[10240]; dataToRead = dataToRead - length; } else { //prevent infinite loop if user disconnects dataToRead = -1; } } } catch (Exception ex) { // Trap the error, if any. Response.Write("Error : " + ex.Message); } finally { if (iStream != null) { //Close the file. iStream.Close(); } Response.End(); }
public void download(string remFileName,string locFileName,Boolean resume) { if(!logined) { login(); }setBinaryMode(true);//Console.WriteLine("Downloading file "+remFileName+" from "+remoteHost + "/"+remotePath);if (locFileName.Equals("")) { locFileName = remFileName; }if(!File.Exists(locFileName)) { Stream st = File.Create(locFileName); st.Close(); }FileStream output = new FileStream(locFileName,FileMode.Open);Socket cSocket = createDataSocket();long offset = 0;if(resume) {offset = output.Length;if(offset > 0 ) { sendCommand("REST "+offset); if(retValue != 350) { //throw new IOException(reply.Substring(4)); //Some servers may not support resuming. offset = 0; } }if(offset > 0) { //if(debug) //{ //Console.WriteLine("seeking to " + offset); //} long npos = output.Seek(offset,SeekOrigin.Begin); //Console.WriteLine("new pos="+npos); } }sendCommand("RETR " + remFileName);if(!(retValue == 150 || retValue == 125)) { throw new IOException(reply.Substring(4)); }while(true) {bytes = cSocket.Receive(buffer, buffer.Length, 0); output.Write(buffer,0,bytes);if(bytes <= 0) { break; } }output.Close(); if (cSocket.Connected) { cSocket.Close(); }//Console.WriteLine("");readReply();if( !(retValue == 226 || retValue == 250) ) { throw new IOException(reply.Substring(4)); }}
并记录 已经读取流的当前长度
下次从此位置 开始 继续读取 上传.
http://blog.csdn.net/ayun00/archive/2006/07/11/904412.aspx
http://www.mimi163.net/cs/wenzhang/2006/2/15/610.htm
http://tech.acnow.net/Html/Web/ASPNET/ASPNET_Skill/2006-5/2/01202906520120294391464_2.shtml
http://www.xfok.com/Tech/.Net/ASP_NET/2004/10-31/8465,34.aspx
byte[] buffer = new Byte[10240]; // Length of the file:
int length; // Total bytes to read:
long dataToRead; // Identify the file to download including its path.
string filepath = @"E:\software\SQL Server 2000 Personal Edition.ISO"; // Identify the file name.
string filename = System.IO.Path.GetFileName(filepath); try
{
// Open the file.
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read,System.IO.FileShare.Read);
Response.Clear(); // Total bytes to read:
dataToRead = iStream.Length; long p = 0;
if(Request.Headers["Range"]!=null)
{
Response.StatusCode = 206;
p = long.Parse( Request.Headers["Range"].Replace("bytes=","").Replace("-",""));
}
if(p != 0)
{
Response.AddHeader("Content-Range","bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());
}
Response.AddHeader("Content-Length",((long)(dataToRead-p)).ToString());
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(Request.ContentEncoding.GetBytes(filename))); iStream.Position = p;
dataToRead = dataToRead - p;
// Read the bytes.
while (dataToRead > 0)
{
// Verify that the client is connected.
if (Response.IsClientConnected)
{
// Read the data in buffer.
length = iStream.Read(buffer, 0, 10240); // Write the data to the current output stream.
Response.OutputStream.Write(buffer, 0, length); // Flush the data to the HTML output.
Response.Flush(); buffer= new Byte[10240];
dataToRead = dataToRead - length;
}
else
{
//prevent infinite loop if user disconnects
dataToRead = -1;
}
}
}
catch (Exception ex)
{
// Trap the error, if any.
Response.Write("Error : " + ex.Message);
}
finally
{
if (iStream != null)
{
//Close the file.
iStream.Close();
}
Response.End();
}
locFileName,Boolean resume)
{
if(!logined)
{
login();
}setBinaryMode(true);//Console.WriteLine("Downloading file "+remFileName+" from "+remoteHost + "/"+remotePath);if (locFileName.Equals(""))
{
locFileName = remFileName;
}if(!File.Exists(locFileName))
{
Stream st = File.Create(locFileName);
st.Close();
}FileStream output = new
FileStream(locFileName,FileMode.Open);Socket cSocket = createDataSocket();long offset = 0;if(resume)
{offset = output.Length;if(offset > 0 )
{
sendCommand("REST "+offset);
if(retValue != 350)
{
//throw new IOException(reply.Substring(4));
//Some servers may not support resuming.
offset = 0;
}
}if(offset > 0)
{
//if(debug)
//{
//Console.WriteLine("seeking to " + offset);
//}
long npos = output.Seek(offset,SeekOrigin.Begin);
//Console.WriteLine("new pos="+npos);
}
}sendCommand("RETR " + remFileName);if(!(retValue == 150 || retValue == 125))
{
throw new IOException(reply.Substring(4));
}while(true)
{bytes = cSocket.Receive(buffer, buffer.Length, 0);
output.Write(buffer,0,bytes);if(bytes <= 0)
{
break;
}
}output.Close();
if (cSocket.Connected)
{
cSocket.Close();
}//Console.WriteLine("");readReply();if( !(retValue == 226 || retValue == 250) )
{
throw new IOException(reply.Substring(4));
}}
http://www.cnblogs.com/gxh973121/archive/2006/06/06/418935.html
http://blog.csdn.net/playyuer/archive/2004/08/02/58430.aspx