データのアップロード中に進捗状況を表示します
-
24-10-2019 - |
質問
次のコードを使用しています ここ ファイルをアップロードします
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
拡張したいので、アップロードの進行状況もできます。問題は、どこから始めればいいのかわからないということです。アップロードの進行状況を表示する「ロジック」は何ですか?
事前定義された部品に「ファイルを分割」してアップロードするのですか?
正しい解決策はありません
他のヒント
UIスレッドのブロックを避けるために、バックグラウンドスレッドでアップロード要求を実行する必要があります。これを行う最も簡単な方法は、バックグラウンドワーカークラスを使用することです。このような状況向けに特別に設計されています。
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
進行状況とrunworkercompletedのイベントはUIスレッドで実行され、現在のダウンロードのステータスに応じて進行状況バーを更新できます。彼らは次のようになります:
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フォームまたはWebページで実行されているかどうかはわかりません。これにより、実際に進行状況を示す方法に違いが生じます。しかし、いずれにせよ、最初にこの方法がそれがどれだけ離れているかについての進捗を報告することを望むでしょう。
そうするために、最善の策はイベントを使用することです。このクラスと機能に追加する必要があるものは次のとおりです。
最初にパーセンテージを保持しているクラス:
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