作者: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 |