Downloads

本指南介绍如何管理文件下载、跟踪下载进度,以及在下载完成时接收通知等内容。

下载文件 

Fuzio 允许你在不导航浏览器到目标 URL 的情况下,在后台加载 URL 并下载其内容。为此,可以使用 downloadUrl(String) 方法:

Java
Kotlin
// 在后台发送 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 关联的所有下载(包括当前应用会话中已完成的下载以及正在进行的下载),可以使用如下方式:

Java
Kotlin
var downloads = profile.downloads().list();
val downloads = profile.downloads().list()

使用 Engine.downloads() 可以获取默认 Profile 的下载服务。

接受下载 

每当某个 Browser 实例需要下载文件时,都会触发 StartDownloadCallback 回调。在该回调中,你可以决定是否允许下载,或者取消该下载请求。

Java
Kotlin
browser.set(StartDownloadCallback.class, (params, tell) -> tell.cancel());
browser.register(StartDownloadCallback { params, tell ->
    tell.cancel()
})

默认情况下,所有下载请求都会被取消。

要更改默认行为并允许下载文件,可以使用如下方式:

Java
Kotlin
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 实例。

例如:

Java
Kotlin
browser.set(StartDownloadCallback.class, (params, tell) -> {
    var download = params.download();
});
browser.register(StartDownloadCallback { params, tell ->
    val download = params.download()
})

暂停下载 

要暂停下载,请使用 Download.pause() 方法:

Java
Kotlin
download.pause();
download.pause()

恢复下载 

要恢复已暂停的下载,请使用 Download.resume() 方法:

Java
Kotlin
if (download.isPaused()) {
    download.resume();
}
if (download.isPaused) {
    download.resume()
}

取消下载 

只要下载尚未进入终止状态,你都可以随时取消下载。终止状态包括:下载已完成、已取消,或无法恢复的中断状态。

要判断下载是否处于终止状态,可以使用 Download.isDone() 方法。

要取消下载,请使用 Download.cancel() 方法:

Java
Kotlin
if (download.state() == DownloadState.IN_PROGRESS) {
    download.cancel();
}
if (download.state() == DownloadState.IN_PROGRESS) {
    download.cancel()
}

下载事件 

你可以跟踪下载进度,并在下载被取消、暂停、中断或完成时接收通知。

下载取消 

要在 Download 被取消时接收通知,请使用 DownloadCanceled 事件:

Java
Kotlin
download.on(DownloadCanceled.class, event -> {});
download.subscribe<DownloadCanceled> { event -> }

下载完成 

要在 Download 完成时接收通知,请使用 DownloadFinished 事件:

Java
Kotlin
download.on(DownloadFinished.class, event -> {});
download.subscribe<DownloadFinished> { event -> }

下载暂停 

要在 Download 被暂停时接收通知,请使用 DownloadPaused 事件:

Java
Kotlin
download.on(DownloadPaused.class, event -> {});
download.subscribe<DownloadPaused> { event -> }

下载进度更新 

要跟踪 Download 进度,请使用 DownloadUpdated 事件:

Java
Kotlin
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 事件:

Java
Kotlin
download.on(DownloadInterrupted.class, event -> {
    // 中断原因,例如文件访问被拒绝、网络失败等。
    var reason = event.reason();
});
download.subscribe<DownloadInterrupted> { event ->
    // 中断原因,例如文件访问被拒绝、网络失败等。
    val reason = event.reason()
}
微信咨询

即库客服

微信公众号二维码

技术客服

微信公众号二维码