Загрузить файл на FTP-сайт с помощью VB.NET

У меня есть этот рабочий код из этого ссылке, чтобы загрузить файл на ftp-сайт:

' set up request...
Dim clsRequest As System.Net.FtpWebRequest = _
    DirectCast(System.Net.WebRequest.Create("ftp://ftp.myserver.com/test.txt"), System.Net.FtpWebRequest)
clsRequest.Credentials = New System.Net.NetworkCredential("myusername", "mypassword")
clsRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile

' read in file...
Dim bFile() As Byte = System.IO.File.ReadAllBytes("C:Temptest.txt")

' upload file...
Dim clsStream As System.IO.Stream = _
    clsRequest.GetRequestStream()
clsStream.Write(bFile, 0, bFile.Length)
clsStream.Close()
clsStream.Dispose()

интересно, если файл уже существует в каталоге ftp, файл будет перезаписан?

6 ответов


смотреть на!--1-->MSDN документация это сопоставляется с командой FTP STOR. Глядя на определение команды FTP STOR, он перезапишет существующие файлы, если у пользователя есть разрешения.

в этом случае, да, файл будет перезаписан.


From:ссылке

СТОР (МАГАЗИН)

стор

эта команда заставляет FTP-сервер принимать данные, передаваемые через подключение к данным, и хранить данные в виде файла на FTP-сервере. Если файл, указанный в pathname, существует на сайте сервера, его содержимое должно быть заменено передаваемыми данными. Новый файл создается на FTP-сервере, если файл, указанный в pathname, еще не существует.


да, протокол FTP перезаписывает существующие файлы при загрузке.


обратите внимание, что есть лучшие способы для осуществления загрузки.

самый тривиальный способ загрузки двоичного файла на FTP-сервер с помощью .NET framework-это использование WebClient.UploadFile:

Dim client As WebClient = New WebClient
client.Credentials = New NetworkCredential("username", "password")
client.UploadFile("ftp://ftp.example.com/remote/path/file.zip", "C:\local\path\file.zip")

Если вам нужен больший контроль, что WebClient не предлагает (например, шифрование TLS/SSL и т. д.), Используйте FtpWebRequest. Простой способ-просто скопировать FileStream к потоку FTP используя Stream.CopyTo:

Dim request As FtpWebRequest =
    WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip")
request.Credentials = New NetworkCredential("username", "password")
request.Method = WebRequestMethods.Ftp.UploadFile

Using fileStream As Stream = File.OpenRead("C:\local\path\file.zip"),
      ftpStream As Stream = request.GetRequestStream()
    fileStream.CopyTo(ftpStream)
End Using

Если вам нужно следить за ходом загрузки, вы должны скопировать содержимое кусками самостоятельно:

Dim request As FtpWebRequest =
    WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip")
request.Credentials = New NetworkCredential("username", "password")
request.Method = WebRequestMethods.Ftp.UploadFile

Using fileStream As Stream = File.OpenRead("C:\local\path\file.zip"),
      ftpStream As Stream = request.GetRequestStream()
    Dim read As Integer
    Do
        Dim buffer() As Byte = New Byte(10240) {}
        read = fileStream.Read(buffer, 0, buffer.Length)
        If read > 0 Then
            ftpStream.Write(buffer, 0, read)
            Console.WriteLine("Uploaded {0} bytes", fileStream.Position)
        End If
    Loop While read > 0
End Using

для прогресса GUI (WinForms ProgressBar), см. Пример C# по адресу:
как мы можем показать индикатор выполнения для загрузки с помощью FtpWebRequest

если вы хотите загрузить все файлы из папки, см. Пример C# в
загрузить каталог файлов с помощью WebClient.


это важно знать, Файлы-ссылки на указатели, которые указывают на массив байтов в памяти.

когда операцию записи файла просят записать файл в указатель, он не будет проверять, существует ли файл; просто файловая система позволит продолжить операцию, если не используются байты в памяти (хотя вы можете принудительно перезаписать).

Если вы хотите проверить, существует ли файл перед записью использования файла мой метод GetDirectory в VB.net вот:https://stackoverflow.com/a/28664731/2701974


используйте эту функцию для загрузки файла

Общественные Суб Протоколу(_FileName Бывал, Как Струна, Бывал _UploadPath Как Строку, _FTPUser Бывал, Как Струна, _FTPPass Бывал Как Строку)

Dim _FileInfo Как Новая Система.ИО.FileInfo (_FileName)

' Create FtpWebRequest object from the Uri provided
Dim _FtpWebRequest As System.Net.FtpWebRequest = CType(System.Net.FtpWebRequest.Create(New Uri(_UploadPath)), System.Net.FtpWebRequest)

' Provide the WebPermission Credintials
_FtpWebRequest.Credentials = New System.Net.NetworkCredential(_FTPUser, _FTPPass)

' By default KeepAlive is true, where the control connection is not closed
' after a command is executed.
_FtpWebRequest.KeepAlive = False

' set timeout for 20 seconds
_FtpWebRequest.Timeout = 20000

' Specify the command to be executed.
_FtpWebRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile

' Specify the data transfer type.
_FtpWebRequest.UseBinary = True

' Notify the server about the size of the uploaded file
_FtpWebRequest.ContentLength = _FileInfo.Length

' The buffer size is set to 2kb
Dim buffLength As Integer = 2048
Dim buff(buffLength - 1) As Byte

' Opens a file stream (System.IO.FileStream) to read the file to be uploaded
Dim _FileStream As System.IO.FileStream = _FileInfo.OpenRead()

Try
    ' Stream to which the file to be upload is written
    Dim _Stream As System.IO.Stream = _FtpWebRequest.GetRequestStream()

    ' Read from the file stream 2kb at a time
    Dim contentLen As Integer = _FileStream.Read(buff, 0, buffLength)

    ' Till Stream content ends
    Do While contentLen <> 0
        ' Write Content from the file stream to the FTP Upload Stream
        _Stream.Write(buff, 0, contentLen)
        contentLen = _FileStream.Read(buff, 0, buffLength)
    Loop

    ' Close the file stream and the Request Stream
    _Stream.Close()
    _Stream.Dispose()
    _FileStream.Close()
    _FileStream.Dispose()
Catch ex As Exception
    MessageBox.Show(ex.Message, "Upload Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

End Sub

КАК ИСПОЛЬЗОВАТЬ:

' Загрузить файл с помощью FTP UploadFile("c:\UploadFile - ... doc","ftp://FTPHostName/UploadPath/UploadFile.док!--13-->", "Имя Пользователя", "Пароль")


это код для загрузки файлов на FTP-сервер

               Dim request As FtpWebRequest = DirectCast(WebRequest.Create(New Uri("ftp://" & server & "/" & folderName & "/" & filename)), System.Net.FtpWebRequest)
                        request.Method = WebRequestMethods.Ftp.UploadFile
                        request.Credentials = New NetworkCredential(username, password)
                        request.UseBinary = True
                        request.UsePassive = True

                        Dim buffer(1023) As Byte
                        Dim bytesIn As Long = 1
                        Dim totalBytesIn As Long = 0

                        Dim filepath As System.IO.FileInfo = New System.IO.FileInfo(file)
                        Dim ftpstream As System.IO.FileStream = filepath.OpenRead()
                        Dim flLength As Long = ftpstream.Length
                        Dim reqfile As System.IO.Stream = request.GetRequestStream()

                        Do Until bytesIn < 1
                            bytesIn = ftpstream.Read(buffer, 0, 1024)
                            If bytesIn > 0 Then
                                reqfile.Write(buffer, 0, bytesIn)
                                totalBytesIn += bytesIn
                            End If
                        Loop

                        reqfile.Close()
                        ftpstream.Close()