asp.net中操作ftp的方法

作者:LoveCherry    转贴自:http://www.cnblogs.com/lovecherry    点击数:479

 

的时候我们上传东西不想传到web目录而是ftp服务器,这样可以不占用服务器宝贵空间,以前发过一个tips中提到利用ftpsupport.dll操作ftp的方法,可能当时没有说清楚,网友要求给个清楚的例子,就随便写了个文件可以上传,下载,删除ftp上的文件:



首先,dll 点击 这里 下载,别忘记给项目添加引用

test.aspx:
<% @ Page language = c#  Codebehind = Test.aspx.cs  AutoEventWireup = false  Inherits = FtpTest.Test   %>
<! DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.0 Transitional//EN  >
< HTML >
     < HEAD >
         < title > Test </ title >
         < meta  name =GENERATOR  Content =Microsoft Visual Studio .NET 7.1 >
         < meta  name =CODE_LANGUAGE  Content =C# >
         < meta  name =vs_defaultClientScript  content =javascript >
         < meta  name =vs_targetSchema  content =http://schemas.microsoft.com/intellisense/ie5 >
     </ HEAD >
     < body >
         < form  id =Form1  method =post  runat =server >
             < input  type =file  id =file1  runat =server >
             < asp:TextBox  id =tb_Dir  runat =server  Width =80px > / </ asp:TextBox >
             < asp:Button  id =btn_upload  runat =server  Text =Upload ></ asp:Button >
             < asp:DataGrid  id =DataGrid1  runat =server  AutoGenerateColumns =False  CellPadding =3  DataKeyField =AutoID >
                 < ItemStyle  Font-Size =9pt  Font-Names =Verdana ></ ItemStyle >
                 < HeaderStyle  Font-Size =9pt  Font-Names =Verdana  Font-Bold =True ></ HeaderStyle >
                 < Columns >
                     < asp:BoundColumn  DataField =FileName  HeaderText =FileName ></ asp:BoundColumn >
                     < asp:BoundColumn  DataField =FilePath  HeaderText =FilePath ></ asp:BoundColumn >
                     < asp:BoundColumn  DataField =FileDownloadName  HeaderText =FileDownloadName ></ asp:BoundColumn >
                     < asp:BoundColumn  DataField =FileSize  HeaderText =FileSize(K) ></ asp:BoundColumn >
                     < asp:BoundColumn  DataField =UploadTime  HeaderText =UploadTime ></ asp:BoundColumn >
                     < asp:ButtonColumn  Text =DOWNLOAD  HeaderText =Download  CommandName =Download ></ asp:ButtonColumn >
                     < asp:ButtonColumn  Text =DEL  HeaderText =Del  CommandName =Del ></ asp:ButtonColumn >
                 </ Columns >
             </ asp:DataGrid >
         </ form >
     </ body >
</ HTML >

test.aspx.cs:

using  System;
using  System.Collections;
using  System.Configuration;
using  System.ComponentModel;
using  System.Data;
using  System.Data.SqlClient;
using  System.Drawing;
using  System.Web;
using  System.Web.SessionState;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.HtmlControls;

namespace  FtpTest
{
     ///   <summary>
     ///  Test 的摘要说明。
     ///   </summary>
     public   class  Test : System.Web.UI.Page
    {
         protected  System.Web.UI.WebControls.Button btn_upload;
         protected  System.Web.UI.HtmlControls.HtmlInputFile file1;
         protected  System.Web.UI.WebControls.TextBox tb_Dir;
         protected  System.Web.UI.WebControls.DataGrid DataGrid1;
    
         private   void  Page_Load( object  sender, System.EventArgs e)
        {
             if ( ! IsPostBack)
            {
                SetBind();
            }
        }

         #region  Web 窗体设计器生成的代码
         override   protected   void  OnInit(EventArgs e)
        {
             //
             //  CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
             //
            InitializeComponent();
             base .OnInit(e);
        }
        
         ///   <summary>
         ///  设计器支持所需的方法 - 不要使用代码编辑器修改
         ///  此方法的内容。
         ///   </summary>
         private   void  InitializeComponent()
        {    
             this .btn_upload.Click  +=   new  System.EventHandler( this .btn_upload_Click);
             this .DataGrid1.ItemCommand  +=   new  System.Web.UI.WebControls.DataGridCommandEventHandler( this .DataGrid1_ItemCommand);
             this .Load  +=   new  System.EventHandler( this .Page_Load);

        }
         #endregion

         private   void  SetBind()
        {
            SqlConnection conn = new  SqlConnection(ConfigurationSettings.AppSettings[ strconn ]);
            SqlDataAdapter da = new  SqlDataAdapter( select * from FTP order by FilePath ,conn);
            DataSet ds = new  DataSet();
            da.Fill(ds);
             this .DataGrid1.DataSource = ds;
             this .DataGrid1.DataBind();
        }

         private   void  btn_upload_Click( object  sender, System.EventArgs e)
        {
            FtpClass ftp = new  FtpClass();
             string  filedownloadname = ftp.FtpUpload( this .file1.PostedFile, this .tb_Dir.Text);
             string  [] arrs = file1.PostedFile.FileName.Split( ' // ' );
             string  filename = arrs[arrs.Length - 1 ];
            SqlConnection conn = new  SqlConnection(ConfigurationSettings.AppSettings[ strconn ]); 
            SqlCommand comm = new  SqlCommand( insert into FTP (FileName,FileDownloadName,FilePath,FileSize,UploadTime) values (@filename,@filedownloadname,@filepath,@filesize,@uploadtime) ,conn); 
            SqlParameter parm1 = new  SqlParameter( @filename ,SqlDbType.NVarChar, 50 ); 
            parm1.Value = filename;
            SqlParameter parm2 = new  SqlParameter( @filedownloadname ,SqlDbType.NVarChar, 50 ); 
            parm2.Value = filedownloadname;
            SqlParameter parm3 = new  SqlParameter( @filepath ,SqlDbType.NVarChar, 50 ); 
            parm3.Value = this .tb_Dir.Text;
            SqlParameter parm4 = new  SqlParameter( @filesize ,SqlDbType.Int); 
            parm4.Value = this .file1.PostedFile.ContentLength / 1024 ;
            SqlParameter parm5 = new  SqlParameter( @uploadtime ,SqlDbType.DateTime); 
            parm5.Value = DateTime.Now.ToString();
            comm.Parameters.Add(parm1); 
            comm.Parameters.Add(parm2); 
            comm.Parameters.Add(parm3); 
            comm.Parameters.Add(parm4);
            comm.Parameters.Add(parm5); 
            conn.Open(); 
            comm.ExecuteNonQuery(); 
            conn.Close(); 
            SetBind();
        }

         private   void  DataGrid1_ItemCommand( object  source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
        {
             if (e.CommandName == Del )
            {
                FtpClass ftp = new  FtpClass();
                ftp.FileDel(e.Item.Cells[ 2 ].Text,e.Item.Cells[ 1 ].Text);
                SqlConnection conn = new  SqlConnection(ConfigurationSettings.AppSettings[ strconn ]); 
                SqlCommand comm = new  SqlCommand( delete from FTP where AutoID=@autoid ,conn); 
                SqlParameter parm1 = new  SqlParameter( @autoid ,SqlDbType.NVarChar, 50 ); 
                parm1.Value = this .DataGrid1.DataKeys[e.Item.ItemIndex];
                comm.Parameters.Add(parm1); 
                conn.Open(); 
                comm.ExecuteNonQuery(); 
                conn.Close();                 
                SetBind();
            }

             if (e.CommandName == Download )
            {
                FtpClass ftp = new  FtpClass();
                ftp.FtpDownload(HttpContext.Current,e.Item.Cells[ 2 ].Text,e.Item.Cells[ 1 ].Text);
            }
        }
    }
}

FtpClass.cs:

using  System;
using  System.Configuration;
using  System.IO;
using  FtpSupport;
using  Microsoft.Win32;
using  System.Web;

namespace  FtpTest
{
     public   class  FtpClass
    {
         private   string  FtpIP = ConfigurationSettings.AppSettings[ FtpIP ];
         private   string  FtpUserName = ConfigurationSettings.AppSettings[ FtpUserName ];
         private   string  FtpPassord = ConfigurationSettings.AppSettings[ FtpPassWord ];
         private  FtpConnection ftp;

         private  FtpConnection FtpConn()
        {
            ftp = new  FtpConnection();
            ftp.Connect( this .FtpIP, this .FtpUserName, this .FtpPassord);
             return  ftp;
        }

         private   string  GetFileExtName( string  filename, bool  withdot)
        {
             string  [] arrs = filename.Split( ' . ' );
             int  i = arrs.Length;
             return  withdot ? . + arrs[i - 1 ].ToString():arrs[i - 1 ].ToString();
        }

         private   string  GetFileContentType( string  filedownloadname)
        {
             string  DEFAULT_CONTENT_TYPE  =   application/unknown ;
            RegistryKey regkey,fileextkey;
             string  FileContentType;
             try  
            {                
                regkey = Registry.ClassesRoot;                
                fileextkey = regkey.OpenSubKey( this .GetFileExtName(filedownloadname, false ));                
                FileContentType = fileextkey.GetValue( Content Type ,DEFAULT_CONTENT_TYPE).ToString();
            }
             catch
            {
                FileContentType = DEFAULT_CONTENT_TYPE;
            }        
             return  FileContentType;
        }

         public   string  FtpUpload(HttpPostedFile file, string  dir)
        {
             string  FileDownloadName = DateTime.Now.ToString( yyyyMMddhhmmss ) + this .GetFileExtName(file.FileName, true );
            FtpConnection ftp = this .FtpConn();
             if (ftp.DirectoryExist(dir))
                ftp.SetCurrentDirectory(dir);
             else
            {
                ftp.CreateDirectory(dir);
                ftp.SetCurrentDirectory(dir);
            }
            ftp.PutStream(file.InputStream,FileDownloadName);
            ftp.Close();
             return  FileDownloadName;
        }

         public   void  FileDel( string  filedownloadname, string  dir)
        {
            FtpConnection ftp = this .FtpConn();
             if (ftp.DirectoryExist(dir))
            {
                ftp.SetCurrentDirectory(dir);
                 if (ftp.FileExist(filedownloadname))
                {
                    ftp.DeleteFile(filedownloadname);
                }
            }
            ftp.Close();
        }

         public   void  FtpDownload(HttpContext context, string  filedownloadname, string  dir)
        {
            context.Response.Clear();
            context.Response.AddHeader( Content-Disposition ,  attachment; filename= + filedownloadname); 
            context.Response.ContentType = this .GetFileContentType(filedownloadname);
            FtpConnection ftp = this .FtpConn();
            ftp.SetCurrentDirectory(dir);
             if (ftp.FileExist(filedownloadname))
            {
                FtpStream ftpfs = ftp.OpenFile(filedownloadname,GenericRights.Read);
                 byte  [] buffer = new   byte [ 10240 ];
                 int  n = ftpfs.Read(buffer, 0 ,buffer.Length);
                 while (n > 0 )
                {
                    context.Response.BinaryWrite(buffer);
                    n = ftpfs.Read(buffer, 0 ,buffer.Length);
                }
                Response.End();
                ftpfs.Close();
            }
             else
            {
                context.Response.Write( <script>alert('file does not exist!');</script> );
            }
            ftp.Close();
        }
    }
}

这个dll在获取ftp文件列表方便存在些问题,等我修改下会放出一个改进版本,所以暂时用数据库保存ftp文件列表先将就下:

数据库:

if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [dbo].[FTP] ' )  and   OBJECTPROPERTY (id, N ' IsUserTable ' )  =   1 )
drop   table   [ dbo ] . [ FTP ]
GO

CREATE   TABLE   [ dbo ] . [ FTP ]  (
     [ AutoID ]   [ varchar ]  ( 50 ) COLLATE Chinese_PRC_CI_AS  NOT   NULL  ,
     [ FileName ]   [ varchar ]  ( 50 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
     [ FilePath ]   [ varchar ]  ( 50 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
     [ FileDownloadName ]   [ varchar ]  ( 50 ) COLLATE Chinese_PRC_CI_AS  NULL  ,
     [ FileSize ]   [ int ]   NULL  ,
     [ UploadTime ]   [ datetime ]   NULL  
)  ON   [ PRIMARY ]
GO

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#写的ASP.NET上传到FTP上,文件,文件夹都可以。 首先,选择本地文件或者文件夹,然后点击上传按钮以后,有一个压缩过程,该过程也有一个实时更新的进度条,并可以显示压缩所需的实时更新的剩余时间,压缩完成以后上传,上传也是有一个实时更新的进度条,显示剩余上传所需时间。上传完成以后显示压缩的时间、上传的时间和总共所需的时间。 根据文件流上传,根据文件流进度做的进度条,是真的实实在在的进度条。 代码都有详细的注释,例如: private string ftpUser = "Administrator"; //ftp用户名 private string ftpPassword = "123456"; //ftp密码 public TimeSpan t; //加载进度条总时间 private DateTime startTotalTimeFtp = System.DateTime.Now; private DateTime endTotalTimeFtp = System.DateTime.Now; //压缩用时(为传值做准备) //public TimeSpan zipTime; //定义开始时间、结束时间和之间的时间段,以此来估计完成所需剩余时间 DateTime startTime = System.DateTime.Now; DateTime endTime = System.DateTime.Now; TimeSpan TimeSp; //定义剩余时间 string surPlusTime = string.Empty; //判断是否小于1秒所用 int Ti = 0; //实例化类TimeSpanClass TimeSpanClass timeSpanClass = new TimeSpanClass(); 进度条可以实时动态更新,显示剩余时间,剩余时间也跟随进度条实时动态更新,上传完成显示上传时间。 再次声明,版权所有(花费本人好几个月的心血研究真实的进度条),保证进度条为真正按照文件流的进度所进行,如有问题,可与本人联系!
ASP.NET是一种用于构建Web应用程序的开发框架,而FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的协议。在ASP.NET,我们可以使用编程的方式来实现FTP下载和打开文件的功能。 首先,我们需要引用System.Net命名空间,这样我们就可以使用其FTP相关类和方法。 要实现FTP下载功能,我们可以使用FtpWebRequest类。首先,我们需要创建一个FtpWebRequest对象,并设置好下载文件的FTP服务器地址、用户名和密码。然后,我们可以设置该请求为下载文件的方式,并指定要下载的文件路径。接下来,我们可以执行该请求,并获取服务器的响应。通过读取响应流,我们可以将文件保存到本地磁盘。 要实现FTP打开功能,我们可以使用WebClient类。与下载功能类似,我们首先创建一个WebClient对象,并设置好FTP服务器地址、用户名和密码。然后,我们可以使用DownloadFile方法,指定要下载的文件路径和保存的本地路径。通过调用Process.Start方法,我们可以在默认的应用程序打开该文件。 总结来说,ASP.NET可以通过FtpWebRequest类和WebClient类实现FTP下载和打开文件的功能。我们只需要设置好FTP服务器地址、用户名、密码和要下载的文件路径,然后执行相应的方法即可实现这些功能。ASP.NET为我们提供了方便的接口来操作FTP服务器,使我们可以轻松地在Web应用程序实现这些功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值