1

ここにある次のコードを使用してファイルをアップロードしています

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

延長したいので、アップロードの進行状況も確認できます。問題は、どこから始めればよいかわからないことです。アップロードの進行状況を表示する「ロジック」は何ですか?

定義済みの部分に「ファイルを分割」してアップロードしますか?

4

2 に答える 2

4

UI スレッドのブロックを回避するには、バックグラウンド スレッドでアップロード リクエストを実行する必要があります。これを行う最も簡単な方法は、BackgroundWorker クラスを使用することです。このような状況のために特別に設計されています。

    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

イベント ProgressChanged および 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))

お役に立てれば。

于 2011-02-02T19:56:58.280 に答える
1

このコードが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
于 2011-02-02T18:24:18.440 に答える