打印本文 打印本文 关闭窗口 关闭窗口
ASP.NET实现FTP文件上载类
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2509  更新时间:2009/4/23 10:33:29  文章录入:mintao  责任编辑:mintao
 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]  下一页

打印本文 打印本文 关闭窗口 关闭窗口