Downloads
本指南介绍如何管理文件下载、跟踪下载进度,以及在下载完成时接收通知等内容。
下载文件
Fuzio 允许你在不导航浏览器到目标 URL 的情况下,在后台加载 URL 并下载其内容。为此,可以使用 downloadUrl(String) 方法:
// 在后台发送 HTTP 请求。
browser.downloadUrl("https://example.com/avatar.png");
// 指定下载保存位置。
browser.set(StartDownloadCallback.class, (params, tell) -> {
var target = params.download().target();
var fileName = target.suggestedFileName();
tell.download(downloadDir.resolve(fileName));
});
// 在后台发送 HTTP 请求。
browser.downloadUrl("https://example.com/avatar.png")
// 指定下载保存位置。
browser.register(StartDownloadCallback { params, tell ->
val target = params.download().target()
val fileName = target.suggestedFileName()
tell.download(downloadDir.resolve(fileName))
})
浏览器会在请求中自动携带该域名下已保存的相应 Cookie。
列出所有下载
要获取与指定 Profile 关联的所有下载(包括当前应用会话中已完成的下载以及正在进行的下载),可以使用如下方式:
var downloads = profile.downloads().list();
val downloads = profile.downloads().list()
使用 Engine.downloads() 可以获取默认 Profile 的下载服务。
接受下载
每当某个 Browser 实例需要下载文件时,都会触发 StartDownloadCallback 回调。在该回调中,你可以决定是否允许下载,或者取消该下载请求。
browser.set(StartDownloadCallback.class, (params, tell) -> tell.cancel());
browser.register(StartDownloadCallback { params, tell ->
tell.cancel()
})
默认情况下,所有下载请求都会被取消。
要更改默认行为并允许下载文件,可以使用如下方式:
browser.set(StartDownloadCallback.class, (params, tell) -> {
var download = params.download();
// 下载目标的相关信息。
var downloadTarget = download.target();
// 通知 engine 下载并保存文件。
tell.download(Paths.get(downloadTarget.suggestedFileName()));
});
browser.register(StartDownloadCallback { params, tell ->
val download = params.download()
// 下载目标的相关信息。
val downloadTarget = download.target()
// 通知 engine 下载并保存文件。
tell.download(Path(downloadTarget.suggestedFileName()))
})
在上述示例中,我们告知库:允许下载该文件,并将其保存到指定的目标路径。
请确保 Chromium 的主进程对目标目录具有创建文件的权限。如果目标目录中已存在同名文件,该文件将被自动覆盖。我们建议在接受下载前先检查目录权限以及文件是否已存在。
控制下载过程
要控制下载过程,可以使用通过 StartDownloadCallback.Params.download() 获取到的 Download 实例。
例如:
browser.set(StartDownloadCallback.class, (params, tell) -> {
var download = params.download();
});
browser.register(StartDownloadCallback { params, tell ->
val download = params.download()
})
暂停下载
要暂停下载,请使用 Download.pause() 方法:
download.pause();
download.pause()
恢复下载
要恢复已暂停的下载,请使用 Download.resume() 方法:
if (download.isPaused()) {
download.resume();
}
if (download.isPaused) {
download.resume()
}
取消下载
只要下载尚未进入终止状态,你都可以随时取消下载。终止状态包括:下载已完成、已取消,或无法恢复的中断状态。
要判断下载是否处于终止状态,可以使用 Download.isDone() 方法。
要取消下载,请使用 Download.cancel() 方法:
if (download.state() == DownloadState.IN_PROGRESS) {
download.cancel();
}
if (download.state() == DownloadState.IN_PROGRESS) {
download.cancel()
}
下载事件
你可以跟踪下载进度,并在下载被取消、暂停、中断或完成时接收通知。
下载取消
要在 Download 被取消时接收通知,请使用 DownloadCanceled 事件:
download.on(DownloadCanceled.class, event -> {});
download.subscribe<DownloadCanceled> { event -> }
下载完成
要在 Download 完成时接收通知,请使用 DownloadFinished 事件:
download.on(DownloadFinished.class, event -> {});
download.subscribe<DownloadFinished> { event -> }
下载暂停
要在 Download 被暂停时接收通知,请使用 DownloadPaused 事件:
download.on(DownloadPaused.class, event -> {});
download.subscribe<DownloadPaused> { event -> }
下载进度更新
要跟踪 Download 进度,请使用 DownloadUpdated 事件:
download.on(DownloadUpdated.class, event -> {
// 以百分比形式输出下载进度。
event.progress().ifPresent(progress ->
System.out.println((int) (progress.value() * 100) + "%")
);
// 当前下载速度(字节/秒)。
var currentSpeed = event.currentSpeed();
// 文件总大小(字节)。
var totalBytes = event.totalBytes();
// 已接收(下载)的字节数。
var receivedBytes = event.receivedBytes();
});
download.subscribe<DownloadUpdated> { event ->
// 以百分比形式输出下载进度。
event.progress().ifPresent { progress ->
println("${(progress.value() * 100).toInt()}%")
}
// 当前下载速度(字节/秒)。
val currentSpeed = event.currentSpeed()
// 文件总大小(字节)。
val totalBytes = event.totalBytes()
// 已接收(下载)的字节数。
val receivedBytes = event.receivedBytes()
}
下载被中断
要在 Download 因某种原因被中断时接收通知,请使用 DownloadInterrupted 事件:
download.on(DownloadInterrupted.class, event -> {
// 中断原因,例如文件访问被拒绝、网络失败等。
var reason = event.reason();
});
download.subscribe<DownloadInterrupted> { event ->
// 中断原因,例如文件访问被拒绝、网络失败等。
val reason = event.reason()
}

