vb.net FTP - 在某些情况下有效

时间:2013-07-24 20:08:20

标签: vb.net

我目前有这个代码作为我的FTP代码(它有魅力!)

 Using ms As New System.IO.MemoryStream
                test.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Png)
                Using wc As New System.Net.WebClient
                    wc.UploadData("ftp://" & My.Settings.username & ":" & My.Settings.password & "@ftp." & My.Settings.server & My.Settings.imagelocation & filename & ".jpg", ms.ToArray())

                End Using
            End Using

但是我有一个新的用户名和目录等,它们包含“@”这是我的用户名,例如:“snap@example.com”

但之前我的用户名是“测试”,你看到没有“@”我猜它,因为它与“@ ftp”部分混淆,任何建议如何解决?

2 个答案:

答案 0 :(得分:1)

简答:

在创建网址之前,使用System.Web.HttpUtility.UrlPathEncode对您的用户名和密码进行编码。

答案很长:

根据the IETF's RFC 1738,这是一个关于网址的标准跟踪文档,它明确地说

  

在用户和密码字段中,必须对任何“:”,“@”或“/”进行编码。

actual URL spec document没有明确提及在用户名和密码中编码特殊字符,但我认为这意味着您可以对它们进行编码。它说

  

因为%符号始终表示     如果是编码字符,则可以通过编码使URL更安全     任何被认为不安全的字符,而已经编码。

所以你应该百分之百地逃脱你的网址中的任何特殊字符,如果是'@'那就是%40。

答案 1 :(得分:0)

或者,您可以使用.net提供的以下类:

  • 的FtpWebRequest
  • WebRequestMethods
  • 的NetworkCredential

            Private Shared Sub UploadFileToFTP(source As String)
            Try
                    Dim filename As String = Path.GetFileName(source)
                    Dim ftpfullpath As String = ftpurl
                    Dim ftp As FtpWebRequest = DirectCast(FtpWebRequest.Create(ftpfullpath), FtpWebRequest)
                    ftp.Credentials = New NetworkCredential(ftpusername, ftppassword)
    
                   ftp.KeepAlive = True
                   ftp.UseBinary = True
                   ftp.Method = WebRequestMethods.Ftp.UploadFile
    
                   Dim fs As FileStream = File.OpenRead(source)
                   Dim buffer As Byte() = New Byte(fs.Length - 1) {}
                   fs.Read(buffer, 0, buffer.Length)
                   fs.Close()
    
                   Dim ftpstream As Stream = ftp.GetRequestStream()
                   ftpstream.Write(buffer, 0, buffer.Length)
                   ftpstream.Close()
            Catch ex As Exception
                     Throw ex
            End Try
            End Sub