ejemplo - Cargar archivo en el sitio FTP usando VB.NET
vb net download ftp (5)
Desde: Enlace
ALMACENAMIENTO (TIENDA)
STOR
Este comando hace que el servidor FTP acepte los datos transferidos a través de la conexión de datos y almacene los datos como un archivo en el servidor FTP. Si el archivo especificado en pathname existe en el sitio del servidor, entonces su contenido debe ser reemplazado por los datos que se transfieren. Se crea un nuevo archivo en el servidor FTP si el archivo especificado en pathname no existe.
Tengo este código de trabajo desde este enlace , para subir un archivo a un sitio 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()
Me pregunto, si el archivo ya existe en el directorio ftp, ¿se sobrescribirá el archivo?
Mirando la documentación de MSDN esto se asigna al comando FTP STOR. Al mirar la definición del comando FTP STOR sobrescribirá los archivos existentes, si el usuario tiene permisos.
Entonces, en este caso, sí, el archivo se sobrescribirá.
Use esta función para cargar archivo
Public Sub UploadFile (ByVal _FileName como cadena, ByVal _UploadPath como cadena, ByVal _FTPUser como cadena, ByVal _FTPPass como cadena)
Dim _FileInfo como nuevo 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
CÓMO UTILIZAR:
''Cargar archivo usando FTP UploadFile ("c: / UploadFile.doc", " ftp: //FTPHostName/UploadPath/UploadFile.doc ", "UserName", "Password")
Es importante saber que los archivos son solo referencias a punteros que apuntan a una matriz de bytes en la memoria.
Cuando se le pide a una operación de escritura de archivos que escriba un archivo en un puntero, no verifica si el archivo existe; Simplemente, el sistema de archivos permitirá que la operación continúe a menos que se estén utilizando los bytes en la memoria ( aunque puede forzar la sobreescritura ).
Si desea verificar si existe un archivo antes de escribir el archivo, use mi método GetDirectory en VB.net aquí: https://.com/a/28664731/2701974
Sí, el protocolo FTP sobrescribe los archivos existentes en la carga.
Tenga en cuenta que hay mejores formas de implementar la carga.
La forma más trivial de cargar un archivo binario en un servidor FTP utilizando .NET Framework es usar 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")
Si necesita un mayor control, que el WebClient
no ofrece (como el cifrado TLS / SSL, etc.), use FtpWebRequest
. La forma más fácil es simplemente copiar una secuencia de FileStream
a FTP usando 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
Si necesita monitorear un progreso de carga, debe copiar los contenidos por partes usted mismo:
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
Para el progreso de la GUI (WinForms ProgressBar
), vea el ejemplo de C # en:
¿Cómo podemos mostrar la barra de progreso para cargar con FtpWebRequest?
Si desea cargar todos los archivos de una carpeta, vea el ejemplo de C # en
Subir el directorio de archivos usando WebClient .