質問

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

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top