0

我目前将此代码作为我的 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”

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

4

2 回答 2

1

简短的回答:

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

长答案:

根据IETF 的 RFC 1738(关于 URL 的标准跟踪文档),它明确表示

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

实际的URL 规范文档没有明确提到在用户名和密码中编码特殊字符,但我认为这暗示您可以对它们进行编码。它说

因为 % 符号始终表示编码字符,所以只需对任何被认为不安全的字符进行编码,同时保留已编码的字符,就可以使 URL 更安全。

因此,您应该对 URL 中的任何特殊字符进行百分比转义,如果是“@”,则为 %40。

于 2013-07-24T20:59:32.903 回答
0

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

  • FtpWebRequest
  • 网络请求方法
  • 网络凭证

            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
    
于 2013-07-24T21:03:37.137 回答