Загрузить файл на FTP-сайт, используя VB.NET - PullRequest
9 голосов
/ 10 января 2012

У меня есть этот рабочий код по этой ссылке , чтобы загрузить файл на 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:\Temp\test.txt")

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

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

Ответы [ 6 ]

9 голосов
/ 10 января 2012

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

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

3 голосов
/ 07 сентября 2017

Да, протокол 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

Информация о прогрессе в графическом интерфейсе (WinForms ProgressBar) приведена в примере C # по адресу:
Как показать индикатор выполнения для загрузки с помощью FtpWebRequest

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

3 голосов
/ 10 января 2012

From: Link

STOR (STORE)

STOR

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

0 голосов
/ 19 марта 2018

это рабочий код для загрузки файлов на 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()
0 голосов
/ 30 апреля 2017

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

Public Sub UploadFile (ByVal _FileName As String, ByVal _UploadPath As String, ByVal _FTPUser As String, ByVal _FTPPass As String)

Dim _FileInfo As New System.IO.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.doc", "Имя пользователя", "Пароль")

0 голосов
/ 23 февраля 2015

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

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

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

...