diff --git a/app/src/main/java/io/legado/app/help/AppWebDav.kt b/app/src/main/java/io/legado/app/help/AppWebDav.kt index 41024e4c4..4b4422629 100644 --- a/app/src/main/java/io/legado/app/help/AppWebDav.kt +++ b/app/src/main/java/io/legado/app/help/AppWebDav.kt @@ -72,6 +72,7 @@ object AppWebDav { WebDav(rootWebDavUrl, mAuthorization).makeAsDir() WebDav(bookProgressUrl, mAuthorization).makeAsDir() WebDav(exportsWebDavUrl, mAuthorization).makeAsDir() + WebDav(bgWebDavUrl, mAuthorization).makeAsDir() val rootBooksUrl = "${rootWebDavUrl}books" defaultBookWebDav = RemoteBookWebDav(rootBooksUrl, mAuthorization) authorization = mAuthorization @@ -159,7 +160,7 @@ object AppWebDav { /** * 获取云端所有背景名称 */ - suspend fun getAllBgWebDavFiles(): Result> { + private suspend fun getAllBgWebDavFiles(): Result> { return kotlin.runCatching { if (!NetworkUtils.isAvailable()) throw NoStackTraceException("网络未连接") @@ -173,9 +174,18 @@ object AppWebDav { /** * 上传背景图片 */ - suspend fun upBgs(files: List) { + suspend fun upBgs(files: Array) { val authorization = authorization ?: return if (!NetworkUtils.isAvailable()) return + val bgWebDavFiles = getAllBgWebDavFiles().getOrThrow() + .map { it.displayName } + .toSet() + files.forEach { + if (!bgWebDavFiles.contains(it.name)) { + WebDav("$bgWebDavUrl${it.name}", authorization) + .upload(it) + } + } } /** diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt index eba7ead65..ef635e564 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt @@ -304,10 +304,17 @@ open class WebDav( suspend fun upload( localPath: String, contentType: String = "application/octet-stream" + ) { + upload(File(localPath), contentType) + } + + @Throws(WebDavException::class) + suspend fun upload( + file: File, + contentType: String = "application/octet-stream" ) { kotlin.runCatching { withContext(IO) { - val file = File(localPath) if (!file.exists()) throw WebDavException("文件不存在") // 务必注意RequestBody不要嵌套,不然上传时内容可能会被追加多余的文件信息 val fileBody = file.asRequestBody(contentType.toMediaType())