Pregunta

Estoy usando el siguiente código ubicado aquí Para cargar archivos

Public Function UploadFile(ByVal oFile As FileInfo) As Boolean
Dim ftpRequest As FtpWebRequest
Dim ftpResponse As FtpWebResponse
Try
ftpRequest = CType(FtpWebRequest.Create(FTPSite + CurrentDirectory + oFile.Name), _
    FtpWebRequest)
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile
ftpRequest.Proxy = Nothing
ftpRequest.UseBinary = True
ftpRequest.Credentials = New NetworkCredential(UserName, Password)
ftpRequest.KeepAlive = KeepAlive
ftpRequest.EnableSsl = UseSSL
If UseSSL Then ServicePointManager.ServerCertificateValidationCallback = _
    New RemoteCertificateValidationCallback(AddressOf ValidateServerCertificate)
Dim fileContents(oFile.Length) As Byte
Using fr As FileStream = oFile.OpenRead
fr.Read(fileContents, 0, Convert.ToInt32(oFile.Length))
End Using
Using writer As Stream = ftpRequest.GetRequestStream
writer.Write(fileContents, 0, fileContents.Length)
End Using
ftpResponse = CType(ftpRequest.GetResponse, FtpWebResponse)
ftpResponse.Close()
ftpRequest = Nothing
Return True
Catch ex As WebException
Return False
End Try
End Function

Me gustaría extenderlo, para que también pueda tener un progreso de carga. El problema es que no sé por dónde empezar. ¿Cuál es la "lógica" de mostrar el progreso de carga?

"Dividir el archivo" en piezas predefinidas y cargarlas o qué?

No hay solución correcta

Otros consejos

Debe ejecutar la solicitud de carga en un hilo de fondo para evitar bloquear el hilo de la interfaz de usuario. La forma más fácil de hacer esto es usar la clase de trabajo de fondo. Está diseñado específicamente para situaciones como esta.

    Dim backgroundWorker As New System.ComponentModel.BackgroundWorker()
    backgroundWorker.WorkerReportsProgress = True
    backgroundWorker.WorkerSupportsCancellation = True
    AddHandler backgroundWorker.DoWork, AddressOf Me.BackgroundFileDownload
    AddHandler backgroundWorker.ProgressChanged, AddressOf Me.ProgressChanged
    AddHandler backgroundWorker.RunWorkerCompleted, AddressOf Me.JobCompleted

Los eventos ProgressChanged y RunworkerCompleted se ejecutan en el hilo de la interfaz de usuario y le permiten actualizar la barra de progreso en consecuencia con el estado de descarga actual. Se verán algo así:

Protected Sub ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
        progressBar.Value = e.ProgressPercentage
End Sub

Dowork se llama en un hilo de fondo, y es donde desea llamar realmente la función de carga () que ha escrito. Para FTPWebRequest, primero querrá obtener el tamaño del archivo, luego, a medida que cargue bloques de datos, divida lo que ha cargado hasta ahora por el tamaño completo del archivo para completar un porcentaje. Algo como

Worker.ReportProgress(Math.Round((_bytesUploaded / _fileSize) * 100))

Espero que esto ayude.

No estoy seguro de si este código se está ejecutando en un formulario o página web de Windows, lo que marcaría la diferencia en la forma en que realmente muestra el progreso. Pero de cualquier manera, primero desea que este método informe el progreso de qué tan lejos está.

Para hacerlo, la mejor opción es usar eventos. Esto es lo que necesitaría agregar a esta clase y función:

Primero una clase que posee el porcentaje:

Public Class ProgressEventArgs
    Inherits System.EventArgs

    Public Sub New(ByVal pPercentage As Decimal)
        _Percentage = pPercentage
    End Sub

    Private _Percentage As Decimal
    Public ReadOnly Property Percentage() As Decimal
        Get
            Return _Percentage
        End Get
    End Property

End Class

A continuación, querrá agregar un evento a la clase a la que pertenece la carga de carga:

Public Event Progress(ByVal sender As Object, ByRef e As ProgressEventArgs)

Finalmente en, por carga, querrás plantear este evento:

....
writer.Write(fileContents, 0, blockread) 
    RaiseEvent Progress(Me, new ProgressEventArgs(100 * block / blocks))
Next
....

Donde sea que llame a esto, puede escuchar el evento:

Private Sub HandleProgress(ByVal sender As Object, ByRef e As ProgressEventArgs)
    '.... Update screen
End Sub

....
AddHandler YourUploadClass.Progress AddressOf HandleProgress
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top