我做一个资源下载站点,资源文件是放在其他目录的,而管理下载的页面是down.aspx当用户通过验证后,就用server.transfer(filepath) (为了隐藏路径)可是down.aspx和资源文件好像必须在同一个目录下才能用,而我的文件是按分类存放的,怎么办呢
而我用下面的代码时,一下载几次,服务器好像就打不开down.aspx的页面了,请高手指导FileStream fs=null; // 10K分块读取
byte[] buffer = new Byte[10000]; // 文件长度
long filelen; //文件已读取
int fileread;
try
{
// 打开文件
fs = new  FileStream(filepath, FileMode.Open,FileAccess.Read,FileShare.Read); // 文件长度
filelen = fs.Length; Response.ContentType="application/octet-stream";
Response.AddHeader ("Content-Disposition", "attachment; filename="+filename+";charset=GB2312"); // 当前文件长度
while (filelen > 0)
{
// 客户端是否已连接
if (Response.IsClientConnected)
{
// 读取数据到缓存
fileread = fs.Read(buffer, 0, 10000); //写入数据到客户端
Response.OutputStream.Write(buffer, 0, fileread); // Flush the data to the HTML output.
Response.Flush(); buffer= new Byte[10000]; filelen = filelen - fileread;
}
else
{
//连接丢失
filelen = -1;
}
}
}
catch 
{
// 错误捕捉
Response.Write("下载失败!");
}
finally
{
if (fs != null)
{
//关闭文件
fs.Close();
}
}

解决方案 »

  1.   

    这是我下载附件的一个方法,请参考
     /// <summary>
            /// 方法编号:06
            /// 方法名称:DownFile
            /// 内容摘要:提示用户导出的文件是打开还是保存
            /// </summary>
            /// <param name="Response">输出流对象</param>
            /// <param name="fileName">下载的默认文件名</param>
            /// <param name="fullPath">文件的全路径包括文件名</param>
            private static bool DownFile(System.Web.HttpResponse Response,string fileName,string fullPath)
            {
                try
                {
                    Response.ContentType = "application/octet-stream";

                    Response.AppendHeader("Content-Disposition","attachment;filename=" + 
                        HttpUtility.UrlEncode(fileName,System.Text.Encoding.UTF8) + ";charset=GB2312");
                    System.IO.FileStream fs= System.IO.File.OpenRead(fullPath);
                    long fLen=fs.Length;                //每100K同时下载数据 
                    int size=102400;                //指定缓冲区的大小
                    byte[] readData = new byte[size];                 //如果每次下载的数据大于文件的大小,改变下载数据大小为文件的大小
                    if(size > fLen)
                    {
                        size=Convert.ToInt32(fLen);
                    }                long fPos=0;
                    bool isEnd=false;                //读文件
                    while (!isEnd) 
                    { 
                        if((fPos+size)>fLen)
                        {
                            size=Convert.ToInt32(fLen-fPos);
                            readData = new byte[size];
                            isEnd=true;
                        }                    //读入一个压缩块 
                        fs.Read(readData, 0, size);
                        Response.BinaryWrite(readData);
                        fPos+=size;
                    } 
                    fs.Close(); 
                    
                    //将服务器上的文件删除
                    System.IO.File.Delete(fullPath);
                    return true;
                }
                catch
                {
                    return false;
                }
            }