转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 站长学院 >> Web开发 >> 正文
ASP.NET实现FTP文件上载类         ★★★★

ASP.NET实现FTP文件上载类

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2509 更新时间:2009/4/23 10:33:29
 If (Not (m_bLoggedIn)) Then
  Login()
 End If

 SetBinaryMode(True)
 If (sLocalFileName.Equals("")) Then
  sLocalFileName = sFileName
 End If
 If (Not (File.Exists(sLocalFileName))) Then
  st = File.Create(sLocalFileName)
  st.Close()
 End If

 output = New FileStream(sLocalFileName, FileMode.Open)
 cSocket = CreateDataSocket()
 offset = 0

 If (bResume) Then
  offset = output.Length

 If (offset > 0) Then
  ‘发送一个FTP命令重新启动
  SendCommand("REST " & offset)
  If (m_iRetValue <> 350) Then
   offset = 0
  End If
 End If

 If (offset > 0) Then
  npos = output.Seek(offset, SeekOrigin.Begin)
 End If
End If

‘发送一个FTP命令重新找到一个文件。
SendCommand("RETR " & sFileName)

If (Not (m_iRetValue = 150 Or m_iRetValue = 125)) Then
 MessageString = m_sReply
 Throw New IOException(m_sReply.Substring(4))
End If

Do While (True)
 m_aBuffer.Clear(m_aBuffer, 0, m_aBuffer.Length)
 m_iBytes = cSocket.Receive(m_aBuffer, m_aBuffer.Length, 0)
 output.Write(m_aBuffer, 0, m_iBytes)

 If (m_iBytes <= 0) Then
  Exit Do
 End If
Loop

output.Close()
If (cSocket.Connected) Then
 cSocket.Close()
End If

ReadReply()
If (Not (m_iRetValue = 226 Or m_iRetValue = 250)) Then
 MessageString = m_sReply
 Throw New IOException(m_sReply.Substring(4))
End If

End Sub

‘这是一个从你的本地硬盘上向你的FTP文件夹中上载文件的函数

Public Sub UploadFile(ByVal sFileName As String)
 UploadFile(sFileName, False)
End Sub

‘这是一个从你的本地硬盘上向你的FTP网页上上载的函数和设置恢复标志

Public Sub UploadFile(ByVal sFileName As String, _
 ByVal bResume As Boolean)

 Dim cSocket As Socket
 Dim offset As Long
 Dim input As FileStream
 Dim bFileNotFound As Boolean

 If (Not (m_bLoggedIn)) Then
  Login()
 End If

 cSocket = CreateDataSocket()
 offset = 0

 If (bResume) Then
 Try
  SetBinaryMode(True)
  offset = GetFileSize(sFileName)
 Catch ex As Exception
  offset = 0
 End Try
End If

If (offset > 0) Then
 SendCommand("REST " & offset)
 If (m_iRetValue <> 350) Then
 ‘远程服务器可能不支持恢复。
  offset = 0
 End If
End If

‘发送一个FTP命令,存储一个文件。 SendCommand("STOR " & Path.GetFileName(sFileName))

If (Not (m_iRetValue = 125 Or m_iRetValue = 150)) Then
 MessageString = m_sReply
 Throw New IOException(m_sReply.Substring(4))
End If

‘在上载之前,检查文件是否存在。
bFileNotFound = False
If (File.Exists(sFileName)) Then
 ‘打开输入流读取源文件
 input = New FileStream(sFileName, FileMode.Open)
 If (offset <> 0) Then
  input.Seek(offset, SeekOrigin.Begin)
 End If

 ‘上载这个文件
 
 m_iBytes = input.Read(m_aBuffer, 0, m_aBuffer.Length)
 Do While (m_iBytes > 0)
  cSocket.Send(m_aBuffer, m_iBytes, 0)
  m_iBytes = input.Read(m_aBuffer, 0, m_aBuffer.Length)
 Loop
 input.Close()
Else
 bFileNotFound = True
End If

If (cSocket.Connected) Then
 cSocket.Close()
End If

‘如果找不到文件,检查返回值

If (bFileNotFound) Then
 MessageString = m_sReply
 Throw New IOException("The file: “& sFileName & " was not found. " & _
"Cannot upload the file to the FTP site")
End If

ReadReply()

If (Not (m_iRetValue = 226 Or m_iRetValue = 250)) Then
 MessageString = m_sReply
 Throw New IOException(m_sReply.Substring(4))
End If
End Sub

‘从远程FTP服务器上删除一个文件。

Public Function DeleteFile(ByVal sFileName As String) As Boolean
 Dim bResult As Boolean

 bResult = True
 If (Not (m_bLoggedIn)) Then
  Login()
 End If
 ‘发送一个FTP命令,删除一个文件。
 SendCommand("DELE " & sFileName)
 If (m_iRetValue <> 250) Then
  bResult = False
  MessageString = m_sReply
 End If

‘返回最终结果

 Return bResult
End Function

‘在远程FTP服务器上重命名一个文件

Public Function RenameFile(ByVal sOldFileName As String, _
ByVal sNewFileName As String) As Boolean

 Dim bResult As Boolean
 bResult = True
 If (Not (m_bLoggedIn)) Then
  Login()
 End If
 ‘发送一个FTP命令,对一个文件重命名
 SendCommand("RNFR " & sOldFileName)
 If (m_iRetValue <> 350) Then
  MessageString = m_sReply
  Throw New IOException(m_sReply.Substring(4))
 End If

 ‘发送一个FTP命令,对一个文件更改为新名称
 ‘如果新的文件名存在,会被覆盖。
 SendCommand("RNTO " & sNewFileName)
 If (m_iRetValue <> 250) Then
  MessageString = m_sReply
  Throw New IOException(m_sReply.Substring(4))
 End If
 ‘返回最终结果
 Return bResult
End Function

‘这是一个在远程服务器上创建目录的函数
Public Function CreateDirectory(ByVal sDirName As String) As Boolean
 Dim bResult As Boolean

 bResult = True
 If (Not (m_bLoggedIn)) Then
  Login()
 End If
 ‘发送一个FTP命令,在FTP服务器上制作一个目录
 SendCommand("MKD " & sDirName)
 If (m_iRetValue <> 257) Then
  bResult = False
  MessageString = m_sReply
 End If

 ‘返回最终结果
 Return bResult
End Function

‘这是一个在远程FTP服务器上删除目录的函数

Public Function RemoveDirectory(ByVal sDirName As String) As Boolean

 Dim bResult As Boolean
 bResult = True
 ‘检查是否已登录FTP服务器
 If (Not (m_bLoggedIn)) Then
  Login()
 End If
 ‘发送一个FTP命令,删除在FTP服务器上的目录
 SendCommand("RMD " & sDirName)
 If (m_iRetValue <> 250) Then
  bResult = False
  MessageString = m_sReply
 End If

 ‘返回最终结果
 Return bResult
End Function

‘这是一个用来在远程FTP服务器上改变当前工作目录的函数。

Public Function ChangeDirectory(ByVal sDirName As String) As Boolean
 Dim bResult As Boolean

 bResult = True
 ‘检查你是否在根目录
 If (sDirName.Equals(".")) Then
  Exit Function
 End If
 ‘检查是否已登录FTP服务器
 If (Not (m_bLoggedIn)) Then
  Login()
 End If
 ‘发送FTP命令,改变在FTP服务器上的目录。
 SendCommand("CWD " & sDirName)
 If (m_iRetValue <> 250) Then
  bResult = False
  MessageString = m_sReply
 End If

 Me.m_sRemotePath = sDirName

 ‘返回最终结果
 Return bResult
End Function

‘关闭远程服务器的FTP链接

Public Sub CloseConnection()
 If (Not (m_objClientSocket Is Nothing)) Then
  ‘发送一个FTP命令,结束FTP服务系统。
  SendCommand("QUIT")
 End If

 Cleanup()
End Sub

#End Region

#Region "Private Subs and Functions"

‘从FTP服务器得到回应。

Private Sub ReadReply()
 m_sMes = ""
 m_sReply = ReadLine()
 m_iRetValue = Int32.Parse(m_sReply.Substring(0, 3))
End Sub

‘清除一些变量

Private Sub Cleanup()
 If Not (m_objClientSocket Is Nothing) Then
  m_objClientSocket.Close()
  m_objClientSocket = Nothing
 End If

 m_bLoggedIn = False
End Sub

‘从FTP服务器读取一行。

Private Function ReadLine(Optional ByVal bClearMes As Boolean = False) As String
 Dim seperator As Char = ControlChars.Lf
 Dim mess() As String

 If (bClearMes) Then
  m_sMes = ""
 End If
 Do While (True)
  m_aBuffer.Clear(m_aBuffer, 0, BLOCK_SIZE)
  m_iBytes = m_objClientSocket.Receive(m_aBuffer, m_aBuffer.Length, 0)
  m_sMes += ASCII.GetString(m_aBuffer, 0, m_iBytes)
  If (m_iBytes < m_aBuffer.Length) Then
   Exit Do
  End If
 Loop

 mess = m_sMes.Split(seperator)
 If (m_sMes.Length > 2) Then
  m_sMes = mess(mess.Length - 2)
 Else
  m_sMes = mess(0)
 End If

 If (Not (m_sMes.Substring(3, 1).Equals(" "))) Then
  Return ReadLine(True)
 End If

 Return m_sMes
End Function

‘这是一个你想链接的FTP服务器用于发送命令的函数。

Private Sub SendCommand(ByVal sCommand As String)
 sCommand = sCommand & ControlChars.CrLf
 Dim cmdbytes As Byte() = ASCII.GetBytes(sCommand)
 m_objClientSocket.Send(cmdbytes, cmdbytes.Length, 0)
 ReadReply()
End Sub

‘创建一个数据包 Private Function CreateDataSocket() As Socket

Dim index1, index2, len As Int32
Dim partCount, i, port As Int32
Dim ipData, buf, ipAddress As String
Dim parts(6) As Int32
Dim ch As Char
Dim s As Socket
Dim ep As IPEndPoint
‘发送一个FTP命令,用于被动数据链接

SendCommand("PASV")
If (m_iRetValue <> 227) Then
 MessageString = m_sReply
 Throw New IOException(m_sReply.Substring(4))
End If

index1 = m_sReply.IndexOf("(")
index2 = m_sReply.IndexOf(")")
ipData = m_sReply.Substring(index1 + 1, index2 - index1 - 1)

len = ipData.Length
partCount = 0
buf = ""

For i = 0 To ((len - 1) And partCount <= 6)
ch = Char.Parse(ipData.Substring(i, 1))
If (Char.IsDigit(ch)) Then
 buf += ch
ElseIf (ch <> ",") Then
 MessageString = m_sReply
 Throw New IOException("Malformed PASV reply: " & m_sReply)
End If

If ((ch = ",") Or (i + 1 = len)) Then
Try
 parts(partCount) = Int32.Parse(buf)
 partCount += 1
 buf = ""
Catch ex As Exception
 MessageString = m_sReply
 Throw New IOException("Malformed PASV reply: " & m_sReply)
End

上一页  [1] [2] [3]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Web开发  · 网页制作
    · 平面设计  · 网站运营
    · 网站推广  · 搜索优化
    · 建站心得  · 站长故事
    · 互联动态
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台