//1asp.net

 

protected void Button1_Click(object sender, EventArgs e)
{
/*
微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite
下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。
代码如下:
*/
Response.ContentType = "application/x-zip-compressed";
Response.AddHeader("Content-Disposition", "attachment;filename=z.zip");
string filename = Server.MapPath("DownLoad/z.zip");
Response.TransmitFile(filename);
}

二、//WriteFile实现下载
protected void Button2_Click(object sender, EventArgs e)
{
/*
using System.IO;

*/
string fileName = "asd.txt";//客户端保存的文件名
string filePath = Server.MapPath("DownLoad/aaa.txt");//路径

FileInfo fileInfo = new FileInfo(filePath);
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/octet-stream";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Response.WriteFile(fileInfo.FullName);
Response.Flush();
Response.End();
}

三、 //WriteFile分块下载
protected void Button3_Click(object sender, EventArgs e)
{
string fileName = "aaa.txt";//客户端保存的文件名
string filePath = Server.MapPath("DownLoad/aaa.txt");//路径

System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);

if (fileInfo.Exists == true)
{
const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力
byte[] buffer = new byte[ChunkSize];

Response.Clear();
System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
long dataLengthToRead = iStream.Length;//获取下载的文件总大小
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
while (dataLengthToRead > 0 && Response.IsClientConnected)
{
int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
Response.OutputStream.Write(buffer, 0, lengthRead);
Response.Flush();
dataLengthToRead = dataLengthToRead - lengthRead;
}
Response.Close();
}
}

四、//流方式下载
protected void Button4_Click(object sender, EventArgs e)
{
string fileName = "aaa.txt";//客户端保存的文件名
string filePath = Server.MapPath("DownLoad/aaa.txt");//路径

//以字符流的形式下载文件
FileStream fs = new FileStream(filePath, FileMode.Open);
byte[] bytes = new byte[(int)fs.Length];
fs.Read(bytes, 0, bytes.Length);
fs.Close();
Response.ContentType = "application/octet-stream";
//通知浏览器下载文件而不是打开
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
}

//----------------------------------------------------------

public void DownloadFile( System.Web.UI.Page WebForm,String FileNameWhenUserDownload ,String FileBody )
{

  WebForm.Response.ClearHeaders();
  WebForm.Response.Clear();
  WebForm.Response.Expires = 0;
  WebForm.Response.Buffer = true;
  WebForm.Response.AddHeader("Accept-Language", "zh-tw");
  //'文件名称
  WebForm.Response.AddHeader("content-disposition", "attachment; filename='"+System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8)+"'");
  WebForm.Response.ContentType = "Application/octet-stream";
  //'文件内容
  WebForm.Response.Write(FileBody);//-----------
WebForm.Response.End();
}


//上面这段代码是下载一个动态产生的文本文件,若这个文件已经存在于服务器端的实体路径,则可以通过下面的函数:

public void DownloadFileByFilePath( System.Web.UI.Page WebForm,String FileNameWhenUserDownload ,String FilePath )
{
  WebForm.Response.ClearHeaders();
  WebForm.Response.Clear();
  WebForm.Response.Expires = 0;
WebForm.Response.Buffer = true;
  WebForm.Response.AddHeader("Accept-Language", "zh-tw");
  //文件名称
  WebForm.Response.AddHeader("content-disposition", "attachment; filename='" + System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8) +"'" );
  WebForm.Response.ContentType = "Application/octet-stream";
  //文件内容
  WebForm.Response.Write(System.IO.File.Rea}dAllBytes(FilePath));//---------
  WebForm.Response.End();

} 一、//TransmitFile实现下载
protected void Button1_Click(object sender, EventArgs e)
{
/*
微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite
下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。
代码如下:
*/
Response.ContentType = "application/x-zip-compressed";
Response.AddHeader("Content-Disposition", "attachment;filename=z.zip");
string filename = Server.MapPath("DownLoad/z.zip");
Response.TransmitFile(filename);
}

二、//WriteFile实现下载
protected void Button2_Click(object sender, EventArgs e)
{
/*
using System.IO;

*/
string fileName = "asd.txt";//客户端保存的文件名
string filePath = Server.MapPath("DownLoad/aaa.txt");//路径

FileInfo fileInfo = new FileInfo(filePath);
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/octet-stream";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Response.WriteFile(fileInfo.FullName);
Response.Flush();
Response.End();
}

三、 //WriteFile分块下载
protected void Button3_Click(object sender, EventArgs e)
{
string fileName = "aaa.txt";//客户端保存的文件名
string filePath = Server.MapPath("DownLoad/aaa.txt");//路径

System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);

if (fileInfo.Exists == true)
{
const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力
byte[] buffer = new byte[ChunkSize];

Response.Clear();
System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
long dataLengthToRead = iStream.Length;//获取下载的文件总大小
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
while (dataLengthToRead > 0 && Response.IsClientConnected)
{
int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
Response.OutputStream.Write(buffer, 0, lengthRead);
Response.Flush();
dataLengthToRead = dataLengthToRead - lengthRead;
}
Response.Close();
}
}

四、//流方式下载
protected void Button4_Click(object sender, EventArgs e)
{
string fileName = "aaa.txt";//客户端保存的文件名
string filePath = Server.MapPath("DownLoad/aaa.txt");//路径

//以字符流的形式下载文件
FileStream fs = new FileStream(filePath, FileMode.Open);
byte[] bytes = new byte[(int)fs.Length];
fs.Read(bytes, 0, bytes.Length);
fs.Close();
Response.ContentType = "application/octet-stream";
//通知浏览器下载文件而不是打开
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
}

//----------------------------------------------------------

public void DownloadFile( System.Web.UI.Page WebForm,String FileNameWhenUserDownload ,String FileBody )
{

  WebForm.Response.ClearHeaders();
  WebForm.Response.Clear();
  WebForm.Response.Expires = 0;
  WebForm.Response.Buffer = true;
  WebForm.Response.AddHeader("Accept-Language", "zh-tw");
  //'文件名称
  WebForm.Response.AddHeader("content-disposition", "attachment; filename='"+System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8)+"'");
  WebForm.Response.ContentType = "Application/octet-stream";
  //'文件内容
  WebForm.Response.Write(FileBody);//-----------
WebForm.Response.End();
}


//上面这段代码是下载一个动态产生的文本文件,若这个文件已经存在于服务器端的实体路径,则可以通过下面的函数:

public void DownloadFileByFilePath( System.Web.UI.Page WebForm,String FileNameWhenUserDownload ,String FilePath )
{
  WebForm.Response.ClearHeaders();
  WebForm.Response.Clear();
  WebForm.Response.Expires = 0;
WebForm.Response.Buffer = true;
  WebForm.Response.AddHeader("Accept-Language", "zh-tw");
  //文件名称
  WebForm.Response.AddHeader("content-disposition", "attachment; filename='" + System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8) +"'" );
  WebForm.Response.ContentType = "Application/octet-stream";
  //文件内容
  WebForm.Response.Write(System.IO.File.Rea}dAllBytes(FilePath));//---------
  WebForm.Response.End();

 

 

 

//2 winform 上传

 /// WebClient上传文件至服务器
        /// </summary>
        /// <param name="localFilePath">文件名,全路径格式</param>
        /// <param name="serverFolder">服务器文件夹路径</param>
        /// <param name="reName">是否需要修改文件名,这里默认是日期格式</param>
        /// <returns></returns>
        public static bool UploadFile(string localFilePath, string serverFolder,bool reName)
        {
            string fileNameExt, newFileName, uriString;
            if (reName)
            {
                fileNameExt = localFilePath.Substring(localFilePath.LastIndexOf(".") + 1);
                newFileName = DateTime.Now.ToString("yyMMddhhmmss") + fileNameExt;
            }
            else
            {
                newFileName = localFilePath.Substring(localFilePath.LastIndexOf("\\")+1);
            }

            if (!serverFolder.EndsWith("/") && !serverFolder.EndsWith("\\"))
            {
                serverFolder = serverFolder + "/";
            }

            uriString = serverFolder + newFileName;   //服务器保存路径
            /**//// 创建WebClient实例
            WebClient myWebClient = new WebClient();
            myWebClient.Credentials = CredentialCache.DefaultCredentials;

            // 要上传的文件
            FileStream fs = new FileStream(newFileName, FileMode.Open, FileAccess.Read);
            BinaryReader r = new BinaryReader(fs);
            try
            {
                //使用UploadFile方法可以用下面的格式
                //myWebClient.UploadFile(uriString,"PUT",localFilePath);
                byte[] postArray = r.ReadBytes((int)fs.Length);
                Stream postStream = myWebClient.OpenWrite(uriString, "PUT");
                if (postStream.CanWrite)
                {
                    postStream.Write(postArray, 0, postArray.Length);
                }
                else
                {
                    MessageBox.Show("文件目前不可写!");
                }
                postStream.Close();
            }
            catch
            {
                //MessageBox.Show("文件上传失败,请稍候重试~");
                return false;
            }

            return true;
        }

 

    

    

   /**//// <summary>
        /// 下载服务器文件至客户端
        /// </summary>
        /// <param name="uri">被下载的文件地址</param>
        /// <param name="savePath">另存放的目录</param>
        public static bool Download(string uri, string savePath)
        {
            string fileName;  //被下载的文件名
            if (uri.IndexOf("\\") > -1)
            {
                fileName = uri.Substring(uri.LastIndexOf("\\") + 1);
            }
            else
            {
                fileName = uri.Substring(uri.LastIndexOf("/") + 1); 
            }


            if (!savePath.EndsWith("/") && !savePath.EndsWith("\\"))
            {
                savePath = savePath + "/";
            }

            savePath += fileName;   //另存为的绝对路径+文件名

            WebClient client = new WebClient();
            try
            {
                client.DownloadFile(uri, savePath);
            }
            catch
            {
                return false;
            }

            return true;
        }


************************************************
命名空间
System.Net;
System.IO;
上传IIS虚拟目录需要给写入权限,下载可能需要匿名访问权限。

 

 

文件流的方式:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ProgressStudy
{
    public interface IDownloadServices
    {
        /// <summary>
        /// 每次下载的大小
        /// </summary>
        int DownloadSize { get; set; }

        /// <summary>
        /// 待下载的文件名,完全路径格式
        /// </summary>
        string FullFileName { get; set; }

        /// <summary>
        /// 文件总大小
        /// </summary>
        long FileSize { get; }

        /// <summary>
        /// 获取文件的数据流对象
        /// </summary>
        /// <returns></returns>
        byte[] GetBuffer();
    }

    /// <summary>
    /// 下载服务器方法类
    /// </summary>
    public class DownloadServices : IDownloadServices, IDisposable
    {
        /// <summary>
        /// 每次下载大小
        /// </summary>
        private const int PROGRESS_UNIT_SIZE = 1024;
        private FileStream FSServer = null;
        private BinaryReader BRServer = null;

        /// <summary>
        /// 构造函数中初始化对象
        /// </summary>
        public DownloadServices(string fullFileName)
        {
            this._FullFileName = fullFileName;
            // 初始化创建对象
            CreateFileStream();
        }

        /// <summary>
        ///  创建对象
        /// </summary>
        /// <returns></returns>
        private bool CreateFileStream()
        {
            try
            {
                FSServer = new FileStream(FullFileName, FileMode.Open, FileAccess.Read);
                BRServer = new BinaryReader(FSServer);

                _FileSize = FSServer.Length;
                return true;
            }
            catch { return false; }
        }

        /// <summary>
        /// 销毁对象
        /// </summary>
        private void CloseFileStream()
        {
            if (FSServer != null)
            {
                FSServer.Close();
            }
            if (BRServer != null)
            {
                BRServer.Close();
            }
        }
        #region IDownloadServices 成员
        private string _FullFileName = string.Empty;
        /// <summary>
        /// 文件名
        /// </summary>
        public string FullFileName
        {
            get
            {
                return this._FullFileName;
            }
            set
            {
                this._FullFileName = value;
            }
        }

        private long _FileSize;
        /// <summary>
        /// 文件总大小
        /// </summary>
        public long FileSize
        {
            get
            {
                return _FileSize;
            }
        }

        private int _DownloadSize = 1024;
        /// <summary>
        /// 每次下载的大小
        /// </summary>
        public int DownloadSize
        {
            get
            {
                return this._DownloadSize;
            }
            set
            {
                this._DownloadSize = value;
            }
        }

        /// <summary>
        /// 获取文件流数据
        /// </summary>
        /// <returns></returns>
        public byte[] GetBuffer()
        {
            Byte[] buffer = BRServer.ReadBytes(PROGRESS_UNIT_SIZE);
            return buffer;
        }
        #endregion

        #region IDisposable 成员
        /// <summary>
        /// 销毁对象
        /// </summary>
        public void Dispose()
        {
            CloseFileStream();
        }
        #endregion
    }
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ProgressStudy
{

    public class DownloadCommon : IDisposable
    {

        public delegate void DownloadHandler(object sender);
        /// <summary>
        /// 上传前方法,参数为文件总大小
        /// </summary>
        public static event DownloadHandler BeforeDownload;
        /// <summary>
        /// 上传过程中方法,参数为当次上传文件大小
        /// </summary>
        public static event DownloadHandler DoDownload;
        /// <summary>
        /// 上传完成方法,参数为当次上传文件大小
        /// </summary>
        public static event DownloadHandler AfterDownload;
        /// <summary>
        /// 上传出错方法,参数为错误信息
        /// </summary>
        public static event DownloadHandler ErrorDownload;

        private FileStream fs = null;
        private BinaryWriter bw = null;

        private int _DownSize = 1024;
        /// <summary>
        /// 每次下载的数据大小(单位:字节),默认 1024 字节
        /// </summary>
        public int DownSize
        {
            get { return this._DownSize; }
            set { this._DownSize = value; }
        }

        /// <summary>
        /// 下载文件
        /// </summary>
        /// <param name="localFile">本地文件保存路径(完全路径格式)</param>
        /// <param name="fullFileName">服务器文件路径(完全路径格式)</param>
        public void Download(string localFile, string fullFileName)
        {
            DownloadServices down = new DownloadServices(fullFileName) { DownloadSize = DownSize };

            // 待下载的总文件大小
            long fileSize = down.FileSize;

            try
            {
                // 读取本地文件到流对象中
                fs = new FileStream(localFile, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                bw = new BinaryWriter(fs);

                // 上传前调用方法
                if (BeforeDownload != null)
                {
                    BeforeDownload(fileSize);
                }
                Byte[] buffer;
                while ((buffer = down.GetBuffer()).Length > 0)
                {
                    bw.Write(buffer);
                    bw.Flush();
                    // 下载过程中
                    if (DoDownload != null)
                    {
                        DoDownload(buffer.Length);
                    }
                }
                // 下载完毕
                if (AfterDownload != null)
                {
                    AfterDownload(null);
                }
            }
            catch (Exception ex)
            {
                if (ErrorDownload != null)
                {
                    ErrorDownload(ex.Message);
                }
            }
            finally
            {
                down.Dispose();
                Dispose();
            }
        }

        /// <summary>
        /// 销毁对象
        /// </summary>
        private void CloseFileStream()
        {
            if (bw != null)
            {
                bw.Close();
            }
            if (fs != null)
            {
                fs.Close();
            }

            BeforeDownload = null;
            DoDownload = null;
            AfterDownload = null;
            ErrorDownload = null;
        }

        #region IDisposable 成员
        /// <summary>
        /// 释放对象
        /// </summary>
        public void Dispose()
        {
            CloseFileStream();
        }
        #endregion
    }
}
 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ProgressStudy
{
    public interface IUploadServices
    {
        /// <summary>
        /// 文件名(不含路径格式)
        /// </summary>
        string FileName { get; }

        /// <summary>
        /// 上载
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="isEnd"></param>
        void Upload(byte[] buffer, bool isEnd);
    }

    /// <summary>
    /// 服务器端方法
    /// </summary>
    public class UploadServices : IUploadServices,IDisposable
    {
        private FileStream FSServer = null;
        private static BinaryWriter BWServer = null;

        private string _FileName = string.Empty;
        /// <summary>
        /// 待上传的文件名,不包含路径
        /// </summary>
        public string FileName
        {
            get { return this._FileName; }
            set { this._FileName = value; }
        }

        /// <summary>
        /// 上传文件保存路径,完全路径格式
        /// </summary>
        private string ServerPath
        {
            get
            {
                return Path.Combine("D:\\Test\\ProgressUpload", FileName);
            }
        }

        public UploadServices()
        {

        }

        public UploadServices(string fileName)
        {
            this._FileName = fileName;
            /// 初始化对象
            CreateFileStream();
        }

        /// <summary>
        ///  创建对象
        /// </summary>
        /// <returns></returns>
        private bool CreateFileStream()
        {
            try
            {
                FSServer = new FileStream(ServerPath, FileMode.Create, FileAccess.Write);
                BWServer = new BinaryWriter(FSServer);
                return true;
            }
            catch { return false; }
        }

        /// <summary>
        /// 每次读取固定字节写入文件
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="isEnd"></param>
        public void Upload(byte[] buffer, bool isEnd)
        {
            BWServer.Write(buffer);
            BWServer.Flush();
        }

        /// <summary>
        /// 关闭对象
        /// </summary>
        private void CloseFileStream()
        {
            if (BWServer != null)
            {
                BWServer.Close();
                BWServer = null;
            }
            if (FSServer != null)
            {
                FSServer.Close();
                FSServer = null;
            }
        }

        #region IDisposable 成员
        /// <summary>
        /// 销毁对象
        /// </summary>
        public void Dispose()
        {
            CloseFileStream();
        }
        #endregion
    }
}
 

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ProgressStudy
{
    /// <summary>
    /// 客户端方法
    /// </summary>
    public class UploadCommon : IDisposable
    {
        public delegate void UploadHander(object sender);
        /// <summary>
        /// 上传前方法,参数为文件总大小
        /// </summary>
        public static event UploadHander BeforeUpLoad;
        /// <summary>
        /// 上传过程中方法,参数为当次上传文件大小
        /// </summary>
        public static event UploadHander DoUpLoad;
        /// <summary>
        /// 上传完成方法,参数为当次上传文件大小
        /// </summary>
        public static event UploadHander AfterUpLoad;
        /// <summary>
        /// 上传出错方法,参数为错误信息
        /// </summary>
        public static event UploadHander ErrorUpLoad;

        private FileStream fs = null;
        private BinaryReader br = null;

        private int _UploadSize = 1024;
        /// <summary>
        /// 每次上载的文件数据大小(单位:字节),默认 1024 字节
        /// </summary>
        public int UploadSize
        {
            get { return this._UploadSize; }
            set { this._UploadSize = value; }
        }

        /// <summary>
        /// 通过字节流上传,使用委托控制进度条
        /// </summary>
        /// <param name="localFile">本地路径</param>
        public void UpLoadFile(string localFile)
        {
            // 服务器端上传服务
            UploadServices upload = new UploadServices(Path.GetFileName(localFile));

            try
            {
                fs = new FileStream(localFile, FileMode.Open, FileAccess.Read);
                br = new BinaryReader(fs);

                // 上传前调用方法
                if (BeforeUpLoad != null)
                {
                    BeforeUpLoad(fs.Length);
                }
                while (true)
                {
                    Byte[] buffer = br.ReadBytes(UploadSize);
                    if (buffer.Length < UploadSize)
                    {
                        upload.Upload(buffer, true);
                        // 上传完毕使用方法
                        if (AfterUpLoad != null)
                        {
                            AfterUpLoad(UploadSize);
                        }
                        break;
                    }
                    else
                    {
                        upload.Upload(buffer, false);
                        if (DoUpLoad != null)
                        {
                            DoUpLoad(UploadSize);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (ErrorUpLoad != null)
                {
                    ErrorUpLoad(ex.Message);
                }
            }
            finally
            {
                Dispose();
                upload.Dispose();
            }
        }

        /// <summary>
        /// 销毁对象
        /// </summary>
        private void CloseFileStream()
        {
            if (br != null)
            {
                br.Close();
            }
            if (fs != null)
            {
                fs.Close();
            }

            BeforeUpLoad = null;
            DoUpLoad = null;
            AfterUpLoad = null;
            ErrorUpLoad = null;
        }

        #region IDisposable 成员
        /// <summary>
        /// 释放对象
        /// </summary>
        public void Dispose()
        {
            CloseFileStream();
        }
        #endregion
    }

 

 

 


2008-07-08 17:02 asp.net下的文件路径的:获得虚拟目录的网站的根目录 string Server.MapPath(string path)
返回与Web服务器上的指定虚拟路径相对应的物理文件路径。
Server.MapPath(Request.ServerVariables["PATH_INFO"])
 
Server.MapPath("/")
Server.MapPath("")
Server.MapPath(".")
Server.MapPath("../")
Server.MapPath("..")
       Page.Request.ApplicationPath
      
   
以上的代码在http://localhost/EnglishClub/manage/WebForm1.aspx页面
运行结果:

C:\Inetpub\wwwroot\EnglishClub\manage\WebForm1.aspx

C:\Inetpub\wwwroot\
C:\Inetpub\wwwroot\EnglishClub\manage
C:\Inetpub\wwwroot\EnglishClub\manage