大きなファイル (アップロードとダウンロード) を処理する Web サイトを運営しています。現在、サイトを Perfect から Vapor に移行しています。Perfect では、ファイルをユーザーにストリーミングし、ファイルの処理後にいくつかのアクションを実行するのは比較的簡単です。
私は Vapor で同じことをしようとしていますが、ストリームが終了したときにコールバックを設定する方法を理解できないようです.
これを行う方法を知っている人はいますか?ここに私が試したいくつかのことがあります。
これが基本構造
func downloadFile(request: Request) -> EventLoopFuture<Response> {
//do some authentication stuff here
let promise = request.eventLoop.makePromise(of: Response.self)
let response = request.fileio.streamFile(at: "somePath")
promise.succeed(response)
let future = promise.futureResult
return future
}
最初の修正
func downloadFile(request: Request) -> EventLoopFuture<Response> {
//do some authentication stuff here
let promise = request.eventLoop.makePromise(of: Response.self)
let response = request.fileio.streamFile(at: "somePath")
promise.succeed(response)
let future = promise.futureResult
future.eventLoop.next().execute {
//run some post-download processing here.
//ideally I would like to know if the download completed or not.
}
return future
}
2 番目の変更
func downloadFile(request: Request) -> EventLoopFuture<Response> {
//do some authentication stuff here
let promise = request.eventLoop.makePromise(of: Response.self)
let response = request.fileio.streamFile(at: "somePath")
promise.succeed(response)
let future = promise.futureResult
future.whenComplete { result in
switch result {
case .succeed:
//run succeed processing here.
case .failure:
//run failure code here
}
}
return future
}
上記のすべてのケースで、すべての処理が即座に行われます (先物とプロミスを扱っており、すべてが非同期であるためと思われます)。
私の質問は、大きなファイルのストリーミングがいつ終了し、ストリームの結果がどうなるかを Vapor で知る方法はありますか? 多分いくつかのミドルウェア?