Вопрос

Я использую следующий код, расположенный здесь Чтобы загрузить файлы

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

Я хотел бы расширить его, чтобы я тоже мог получить прогресс загрузки. Проблема в том, что я не знаю, откуда начать. Какова «логика» отображения прогресса загрузки?

«Разделите файл» в предопределенных частях и загрузите их или как?

Нет правильного решения

Другие советы

Вам нужно выполнить запрос на загрузку в фоновом потоке, чтобы не блокировать поток пользовательского интерфейса. Самый простой способ сделать это - использовать класс фоновых работников. Он разработан специально для таких ситуаций.

    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

Events Progressed и RunworkerCompleted запускаются в потоке пользовательского интерфейса и позволяют вам обновить строку прогресса соответственно со статусом текущей загрузки. Они будут выглядеть примерно так:

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

Dowork вызывается в фоновом потоке, и это то, где вы хотите на самом деле вызвать функцию uploadfile (), которую вы написали. Для ftpwebRequest вы захотите сначала получить размер файла, затем, когда вы загружаете блоки данных, разделите то, что вы загрузили до сих пор на полный размер файла, чтобы завершить процент. Что-то типа

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

Надеюсь это поможет.

Я не уверен, работает ли этот код на форме Windows или на веб -странице, что изменило бы то, как вы на самом деле показываете прогресс. Но в любом случае вы сначала хотите, чтобы этот метод сообщил о прогрессе в том, насколько это далеко.

Для этого лучше всего использовать события. Вот что вам нужно добавить в этот класс и функция:

Сначала класс, проводящий процент:

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

Далее, вы захотите добавить событие в класс, которому принадлежит файл uploadfile:

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

Наконец, uploadfile, вы захотите поднять это событие:

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

Куда бы вы ни называли это, вы можете прослушать событие:

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

....
AddHandler YourUploadClass.Progress AddressOf HandleProgress
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top