首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

用C#在网页上实现文件下载,多种方法均不成功,求解!多谢

2013-09-15 
用C#在网页上实现文件下载,多种方法均不成功,求解!谢谢DownFiletbl.Rows[e.NewEditIndex].Cells[9].Text为

用C#在网页上实现文件下载,多种方法均不成功,求解!谢谢
DownFiletbl.Rows[e.NewEditIndex].Cells[9].Text为文件路径;
具体代码如下:
1、第1种方法:
   string fileRpath = DownFiletbl.Rows[e.NewEditIndex].Cells[9].Text;
   Response.ClearHeaders();
   Response.Clear();
   Response.Expires = 0;
   Response.Buffer = true;
   Response.AddHeader("Accept-Language", "zh-tw");
   string name = System.IO.Path.GetFileName(fileRpath);
   System.IO.FileStream files = new FileStream(fileRpath, FileMode.Open, FileAccess.Read, FileShare.Read);
   byte[] byteFile = null;
   if (files.Length == 0)
   {
     byteFile = new byte[1];
   }
   else
   {
     byteFile = new byte[files.Length];
   }
   files.Read(byteFile, 0, (int)byteFile.Length);
   files.Close();

   Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(name, System.Text.Encoding.UTF8));
   Response.ContentType = "application/octet-stream;charset=gbk";
   Response.BinaryWrite(byteFile);
   Response.End();

2、第2种方法:
   string path = DownFiletbl.Rows[e.NewEditIndex].Cells[9].Text;

   var vPos = path.IndexOf("\\files");
   path = path.Substring(vPos + 1, path.Length - vPos - 1);

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

    try
    {
      //以字符流的形式下载文件
       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.Close();
      //Response.End();
    }
    catch (Exception ex)
    {
      Response.Write("无法下载文件:" + fileName + ",由于:" + ex.Message + "");
    }
3、第3种方法:
   string path = DownFiletbl.Rows[e.NewEditIndex].Cells[9].Text;
   var vPos = path.IndexOf("\\files");
   path = path.Substring(vPos + 1, path.Length - vPos - 1);

   string fileName = "f:\\asd.txt";//客户端保存的文件名
    string filePath = Server.MapPath(path);//路径

    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();

4、第4种方法:
    string path = DownFiletbl.Rows[e.NewEditIndex].Cells[9].Text;
    var vPos = path.IndexOf("\\files");
    path = path.Substring(vPos + 1, path.Length - vPos - 1);

    Response.ContentType = "application/x-zip-compressed";
    Response.AddHeader("Content-Disposition", "attachment;filename=z.zip");
    string filename = Server.MapPath(path);
    Response.TransmitFile(filename);

5、第5种方法:
        string path = DownFiletbl.Rows[e.NewEditIndex].Cells[9].Text;

        var vPos = path.IndexOf("\\files");
        path = path.Substring(vPos + 1, path.Length - vPos - 1);

        string fileName = HttpContext.Current.Server.UrlEncode(path.Substring(path.LastIndexOf("//") + 1));


        try
        {
            FileInfo info = new FileInfo(HttpContext.Current.Server.MapPath(path));
            long fileSize = info.Length;
            Response.Clear();
            Response.ContentType = "application/x-zip-compressed";
            Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
            //不指明Content-Length用Flush的话不会显示下载进度 
            Response.AddHeader("Content-Length", fileSize.ToString());
            Response.TransmitFile(path, 0, fileSize);
            Response.Flush();
            Response.Close();
        }
        catch (Exception ex)
        {
            Response.Write("无法下载文件:" + fileName + ",由于:" + ex.Message + "");
        }

6、第6种方法:
        string fileName = "C:\\asd.txt";//客户端保存的文件名
        string fileNameEx = DownFiletbl.Rows[e.NewEditIndex].Cells[9].Text;

        var  vPos = fileNameEx.IndexOf("\\files");
        fileNameEx = fileNameEx.Substring(vPos + 1, fileNameEx.Length - vPos - 1);

        string filePath = Server.MapPath(fileNameEx);//路径
        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();

6种方法大同小异,但是试了都不成功,求大虾指点,谢谢!
[解决办法]
我经常用的一个方法你直接调就好了,传一个文件名(全路径)



    protected void DownLoad(string filePath)
    {

        int intStart = filePath.LastIndexOf("\") + 1;
        string saveFileName = filePath.Substring(intStart, filePath.Length - intStart);
        Response.Clear();
        Response.Buffer = true;
        Response.AppendHeader("Content-Disposition", "attachment;filename=" + saveFileName);
        Response.WriteFile(filePath);
        Response.Flush();
        Response.Close();
        Response.End();
    }

热点排行