none
求教高手关于FTP 下载到WEB页后的问题! RRS feed

  • 问题

  •                                

    使用以下代码总是会在输出的文件后面多了一串空格,不知道为什么,如是果TXT文件可以很明显地看出来比原文件多了很多空格,如果是RAR这类压缩文件,根本解压不了,会报错,求教高手指点,谢谢。

    public class ftp
        {
             string ftpServerIP;//服务器ip地址

             string ftpUserID;//用户名

             string ftpPassword;//密码

            FtpWebRequest reqFTP;

            private void Connect(String path)//连接ftp
            {

                // 根据uri创建FtpWebRequest对象


                //reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(HttpUtility.UrlDecode(path)));

                // 指定数据传输类型

                reqFTP.UseBinary = true;

                // ftp用户名和密码

                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);

            }

            public void FtpUpDown(string ftpServerIP, string ftpUserID, string ftpPassword)

            {
                this.ftpServerIP = ftpServerIP;

                this.ftpUserID = ftpUserID;

                this.ftpPassword = ftpPassword;
            }

    public bool Downloadweboutput(string fullpathwithname,System.Web.UI.Page p)
            {
                string uri = "ftp://";//+ ftpServerIP + "/" + FileUpload1.FileName;
                uri = fullpathwithname.Replace("\\\\", "/");
                Connect(uri);
                FtpWebResponse fresponse = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = fresponse.GetResponseStream();

                long cl = fresponse.ContentLength;
                int bufferSize = 2048;
                int readCount;
                byte[] buffer = new byte[bufferSize];

                readCount = ftpStream.Read(buffer, 0, bufferSize);

               // p.Response.Clear();
                HttpContext.Current.Response.Clear();
                while (readCount > 0)
                {                               
                    p.Response.BinaryWrite(buffer);
                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                }
                     ftpStream.Close();   

                     p.Response.Flush();
                     p.Response.Close();

                     fresponse.Close();
                return true;
            }

    }



                                                    
    • 已编辑 hzpemu 2013年12月5日 1:20
    2013年12月5日 1:11

全部回复

  •  前端代码如下

    protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    HttpResponse response = this.Response;

    。。。

          response.ContentType = "application/octet-stream";
                        response.AppendHeader("content-disposition", "attachment;filename=" +

                       HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));

    。。。。

                       

     if (fullpath.ToLower().Substring(0, 3) == "ftp")
                    {
                        ftp ftp1 = new ftp();
                        ftp1.FtpUpDown("", System.Configuration.ConfigurationManager.AppSettings["ftpuser"].ToString(), System.Configuration.ConfigurationManager.AppSettings["ftppassword"].ToString());
                        string downerr = "FTP下载错误!";

                        if (ftp1.Downloadweboutput(fullpath,this)==false)
                        {
                            Response.Write("<script>alert('"+downerr+"')</script> ");
                        }
                        return;
                    }

    。。。

    }

    }

                                    
    2013年12月5日 1:17
  • 另外还有个问题关于下载后的文件空格变成了+号,在网上找到解决的办法,但不知道这些应该加在哪里怎么写合适,求指点,谢谢。

     /// 另外:UrlEncode编码后会把文件名中的空格转换中+(+转换为%2b),但是浏览器是不能理解加号为空格的,所以在浏览器下载得到的文件,空格就变成了加号;
          /// 解决办法:UrlEncode 之后, 将 "+" 替换成 "%20",因为浏览器将%20转换为空

    2013年12月5日 1:30
  • p.Response.BinaryWrite(buffer,0,readCount );

    http://feiyun0112.cnblogs.com/

    2013年12月5日 1:30
    版主
  • 两个问题已解决 第一个问题:把int bufferSize = 2048; 这行换成int bufferSize = 1; 第二个问题:把response.AppendHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8)); 换成 response.ContentType = "application/octet-stream"; response.AppendHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8).Replace("+","%20")); 即可。至于第一个问题我想求教高手们,看看有没有别的解决方法。
    2013年12月5日 3:13