ASP.NET文件下载避免使用WriteFile方法

在你的Page_Load中添加这样的代码:

Page.Response.Clear();
bool success = ResponseFile(Page.Request,Page.Response, "目的文件名称 " , @" 源文件路径 " , 1024000 );
if ( ! success)
Response.Write(
" 下载文件出错! " );
Page.Response.End();

文件下载函数代码为:
public static bool ResponseFile(HttpRequest_Request,HttpResponse_Response, string _fileName, string _fullPath, long _speed)
{
try
{
FileStreammyFile
=newFileStream(_fullPath,FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
BinaryReaderbr
=newBinaryReader(myFile);
try
{
_Response.AddHeader(
"Accept-Ranges","bytes");
_Response.Buffer
=false;
longfileLength=myFile.Length;
longstartBytes=0;

doublepack=10240;//10Kbytes
//intsleep=200;//每秒5次即5*10Kbytes每秒
intsleep=(int)Math.Floor(1000*pack/_speed)+1;
if(_Request.Headers["Range"]!=null)
{
_Response.StatusCode
=206;
string[]range=_Request.Headers["Range"].Split(newchar[]{'=','-'});
startBytes
=Convert.ToInt64(range[1]);
}

_Response.AddHeader(
"Content-Length",(fileLength-startBytes).ToString());
if(startBytes!=0)
{
//Response.AddHeader("Content-Range",string.Format("bytes{0}-{1}/{2}",startBytes,fileLength-1,fileLength));
}

_Response.AddHeader(
"Connection","Keep-Alive");
_Response.ContentType
="application/octet-stream";
_Response.AddHeader(
"Content-Disposition","attachment;filename="+HttpUtility.UrlEncode(_fileName,System.Text.Encoding.UTF8));

br.BaseStream.Seek(startBytes,SeekOrigin.Begin);
intmaxCount=(int)Math.Floor((fileLength-startBytes)/pack)+1;

for(inti=0;i<maxCount;i++)
{
if(_Response.IsClientConnected)
{
_Response.BinaryWrite(br.ReadBytes(
int.Parse(pack.ToString())));
Thread.Sleep(sleep);
}

else
{
i
=maxCount;
}

}

}

catch
{
returnfalse;
}

finally
{
br.Close();

myFile.Close();
}

}

catch
{
returnfalse;
}

returntrue;
}

这样就实现了文件下载时,不管是什么格式的文件,都能够弹出打开/保存窗口.

你可能感兴趣的:(asp.net)