Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >打造高效上传体验:基于Kotlin的Android快速上传框架

打造高效上传体验:基于Kotlin的Android快速上传框架

原创
作者头像
对话、
修改于 2024-06-20 09:20:23
修改于 2024-06-20 09:20:23
3620
举报
文章被收录于专栏:Android-XjAndroid-Xj

1. 引言

Android开发中,文件上传操作常常面临各种挑战,为此我开源了一个高效、易用的快速上传框架,助力开发者轻松实现文件上传功能。 GitHub项目地址: 点我

2. 框架特点概述

  • Kotlin编写:简洁、现代的编程语言。
  • 高效的协程:异步处理上传任务,保证界面流畅。
  • OkHttp封装:稳定可靠的HTTP请求处理。

3. 效果预览

单文件上传模式

单文件上传模式多个文件上传

多个文件同时上传模式

单文件上传模式
单文件上传模式多个文件上传
多个文件同时上传模式

4. 快速开始

依赖配置

  • 添加仓库
代码语言:groovy
AI代码解释
复制
// build.gradle(Project:)
allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}
  • 添加依赖
代码语言:groovy
AI代码解释
复制
// build.gradle(Module:)
dependencies {
    implementation 'com.github.XJ-Up:quickupload:1.1.0'
}

5.详细使用说明

第一步 Application进行初始化配置

代码语言:kotlin
AI代码解释
复制
//defaultNotificationChannel用于后台服务需自行createNotificationChannel详情见demo(startForegroundService)
//debug 用于是否打印日志
 UploadConfiguration.initialize(
            context = this,
            defaultNotificationChannel = notificationChannelID,
            debug = BuildConfig.DEBUG
        )

第二步 创建并启动上传任务(可分开)

构建数据类并继承 UploadObserverBase() ,其中fileName、filePath均为自定义内容
代码语言:kotlin
AI代码解释
复制
data class FileItem(
    val fileName: String,
    val filePath: String,
) : UploadObserverBase()
创建数据类对象 赋值uploadId 添加至观察者
代码语言:kotlin
AI代码解释
复制
fileItem = FileItem(name(Uri.parse(path)), path)
fileItem?.uploadId = path //根据你的具体情况选择合适的值作为 uploadId
//添加至观察者
UploadService.observers.add(fileItem)

创建 QuickUploadRequest 并赋值给数据类

代码语言:kotlin
AI代码解释
复制
 --单文件上传
val request = QuickUploadRequest(this, serverUrl = "你的上传地址")
    .setMethod("POST")
    .addFileToUpload(
        filePath = fileItem!!.filePath,
        parameterName = "files"
    )
    .setResumedFileStart(0)//如果需要断点续传调用此方法,默认情况下不需要调用
fileItem.quickUploadRequest = request

 --多个单文件上传
fileList.forEachIndexed { index, s ->
    val request =
        QuickUploadRequest(this, serverUrl = "你的上传地址")
            .setMethod("POST")
            .addFileToUpload(
                filePath = s.filePath,
                parameterName = "files"
            )
    s.quickUploadRequest = request
}

 --多文件同时上传
val  request=QuickUploadRequest(this, serverUrl = "你的上传地址")
    .setMethod("POST")
    .apply {
        it.filePath .forEachIndexed { index, s ->
            addFileToUpload(
                filePath = s,
                parameterName = "files"
            )
        }
    }
filesItem.quickUploadRequest=request
开始或停止上传
代码语言:kotlin
AI代码解释
复制
fileItem.startUpload()
fileItem.stopUpload()
断点续传
代码语言:kotlin
AI代码解释
复制
   //如果需要断点续传调用此方法,默认情况下不需要调用(注意:0或不传效果都是重新上传,此方法必须在startUpload之前调用)
   //参数传入上次断点位置(一般这个位置通过后台服务器获取)
   quickUploadRequest.setResumedFileStart(0)
                  

第三步 监听上传获取上传详情

代码语言:kotlin
AI代码解释
复制
   fileItem.refresh { uploadStatus, uploadInfo, throwable, serverResponse ->
    when (uploadStatus) {
        UploadStatus.DEFAULT -> {
            //默认初始化状态
        }
        UploadStatus.Wait -> {
            //加入上传队列,但不一定开始上传时
        }
        UploadStatus.InProgress -> {
            //上传中进度
        }
        UploadStatus.Success -> {
            //上传成功时
        }
        UploadStatus.Error -> {
            //出现异常时
        }
        UploadStatus.Completed -> {
            //上传完成时调用 ,注意:成功或错误都会触发
        }
        else -> {}
    }

}

自定义日志

代码语言:kotlin
AI代码解释
复制
     	    Logger.setDelegate(object : Logger.Ext{
           override fun debug(component: String, uploadId: String, message: String) {
              
           }

           override fun error(
               component: String,
               uploadId: String,
               message: String,
               exception: Throwable?
           ) {
              
           }

           override fun info(component: String, uploadId: String, message: String) {
              
           }

       })

配置或管理 API

代码语言:kotlin
AI代码解释
复制
        quickUploadRequest.addArrayParameter()//将具有多个值的参数添加到此上传请求中
        quickUploadRequest.addHeader()//向此上传请求添加标头
        quickUploadRequest.addParameter()//为该上传请求添加一个参数
        quickUploadRequest.setMethod()//设置要使用的HTTP方法
        quickUploadRequest.setMaxRetries()//设置发生错误时库将尝试的最大重试次数
        quickUploadRequest.setAutoDeleteFilesAfterSuccessfulUpload()//设置上传成功后自动删除文件
        quickUploadRequest.setUploadID()//设置上传id



        UploadConfiguration.dispatcher= //设置自定义调度器
        UploadConfiguration.maxConcurrentTasks=//设置最大并发任务数
        UploadConfiguration.retryPolicy=//设置上传服务重试策略 
        UploadConfiguration.defaultNotificationChannel=//设置通知通道
        

具体使用可参考demo

GitHub项目地址: 点我

6.常见问题解答

  • 如何处理上传失败? **当上传失败时 refresh 中的 UploadStatus.Error ->会触发,通过exception参数获取异常信息 ,常见的异常: UserCancelledUploadException 用户已取消上传的异常 UploadError 上传过程错误的异常 NoNetworkException 网络连接断开的异常。它们都继承Throwable。通过判断异常决定后续处理 **
  • 如何取消上传任务?
代码语言:kotlin
AI代码解释
复制
UploadService.taskList//获取当前所有活跃的上传任务
UploadService.stopAllUploads()//停止所有活动的上传任务。onError触发。
UploadService.stopUpload(uploadId)//停止特定上传任务
UploadService.stop(context)//如果当前没有正在运行的任务,则停止 UploadService
UploadService.stop(context, forceStop = true) //强制停止 UploadService 中止任何当前正在运行的任务
  • 如何获取上传进度? **当上传开始时 refresh 中的 UploadStatus.InProgress ->会触发,通过 uploadInfo.progressPercent获取 **

7.结语

**希望这个框架能帮助你简化上传任务,提高开发效率。如果你有任何问题或建议,欢迎在GitHub点我上提出Issue或提交Pull Request。让我们一起打造更好的开源项目! **

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
springboot实战之文件分片上传、断点续传、秒传
上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有比较好的上传体验呢,答案有的,就是下边要介绍的几种上传方式
lyb-geek
2019/11/20
24.9K2
springboot实战之文件分片上传、断点续传、秒传
字节面试官:请你实现一个大文件上传和断点续传
原 作 者:yeyan1996原文链接:https://url.cn/5h66afn
Nealyang
2020/02/19
3K0
大文件上传:秒传、断点续传、分片上传
文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。
程序员小猿
2022/03/09
2.2K0
消息服务框架使用案例之--大文件上传(断点续传)功能
消息服务框架使用案例之--大文件上传(断点续传)功能 一、分块上传和断点续传原理 在我们的一个产品应用中,客户需要上传大量的文件到服务器,其中不乏很大的视频文件。虽然可以使用FTP这样成熟稳定的工具,但客户表示不会使用FTP工具,并且我们产品也觉得客户从我们软件在切换到FTP用户体验不好,如果做成后台脚本调用FTP上传那么进度信息很难呈现到我们软件上。最终,决定我们自己做文件上传功能。     大文件上传受限于服务器每次处理数据的能力,不能一次传输完成,所以分块上传是必然的了,由于上传时间可能较长,中途可能
用户1177503
2018/02/27
2.1K0
Springboot大文件上传下载实现思路,分片、断点续传代码
WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。
星辰大海的精灵
2024/12/03
5701
JLight——JavaWeb的轻量级开发框架
@Config可以配置端口号、项目根路径、扫描包路径。其中扫描包路径需要填项目的groupId名称。
易兮科技
2021/12/08
1.1K0
如何使用Java语言实现文件分片上传和断点续传功能?
在Web应用程序中,文件上传是比较常见的功能。但是,如果要上传大文件,则可能会出现上传时间过长、网络中断等问题,因此需要实现文件分片上传和断点续传功能。本文将介绍如何使用Java语言实现文件分片上传和断点续传功能。
网络技术联盟站
2023/06/05
1.6K1
前端实现文件的断点续传
以前文件无法分割,但随着HTML5新特性的引入,类似普通字符串、数组的分割,我们可以可以使用slice方法来分割文件。
书童小二
2018/09/03
3.2K0
前端实现文件的断点续传
UnityWebRequest教程☀️2021,你还在使用过时的 www API吗?
UnityWebRequest数据传输,除了一般我们用的最多的Post、Get,其实还有Put、Head
星河造梦坊官方
2024/08/15
2290
UnityWebRequest教程☀️2021,你还在使用过时的 www API吗?
Spring Boot 2.x(十六):玩转vue文件上传
最近用到了Vue + Spring Boot来完成文件上传的操作,踩了一些坑,对比了一些Vue的组件,发现了一个很好用的组件——Vue-Simple-Uploader,先附上gayhub的
山禾说
2019/05/16
1.6K0
Spring Boot 2.x(十六):玩转vue文件上传
MinIO 分片上传
MinIO 简单易用。简单性是 EB 级数据基础设施的基础 - 无论是在技术上还是在操作上。MinIO 使用和部署非常简单,没有其他对象存储可以让您在最快的时间内实现下载到生产环境的部署。
恋喵大鲤鱼
2023/10/12
4.8K0
MinIO 分片上传
大文件分片上传和分片下载
大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder
前端柒八九
2024/07/02
6240
大文件分片上传和分片下载
细说分片上传与极速秒传(SpringBoot+Vue实现)
1)调大服务端的文件上传限制:在一定长度上可以缓解上传限制问题,但并不是最优解。一方面无限制地调大上传大小会加大服务端的压力;一方面这个限制值调成多少是个需要考量的问题。
玛卡bug卡
2022/09/20
2.4K0
深入理解文件上传下载的原理及实现逻辑
文件上传的是根据 http 协议的规范和定义,完成请求消息体的封装和消息体的解析,然后将二进制内容保存到文件。
Lion 莱恩呀
2025/01/01
4230
深入理解文件上传下载的原理及实现逻辑
大文件分片上传Java版简单实现
该实例是一个串行上传分片数据的实例,一个文件仅在数据库中保存了一条记录,每次上传一个分片时更新一次该记录,直到该文件到所有分片上传完成。
WindCoder
2020/06/28
9.1K3
微服务架构 | 怎样解决分片上传及断点续传?
导读:分片上传、断点续传,这两个名词对于做过或者熟悉文件上传的朋友来说应该不会陌生,总结本篇文章希望对从事相关工作的同学能够有所帮助或者启发。
码农架构
2021/12/27
2.2K0
微服务架构  |  怎样解决分片上传及断点续传?
文件上传杂谈
文件上传是前端很常见的一类场景。图片、视频和文档等等都属于文件范畴,每个文件则是通过 File.Type 进行更细的划分。本文将针对文件上传的一些通用维度场景做简单的剖析和尝试,抛砖引玉,希望共同学习,共同成长。
有赞coder
2021/01/18
1.6K0
文件上传杂谈
大文件上传服务器:支持超大文件HTTP断点续传的实现办法
来源:blog.csdn.net/ababab12345/article/details/80490621
用户1516716
2021/07/06
2K0
大文件上传时如何做到秒传?
文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有比较好的上传体验呢,答案有的,就是下边要介绍的几种上传方式
二哥聊运营工具
2022/07/11
1.1K0
大文件上传时如何做到秒传?
鸿蒙(HarmonyOS)性能优化实战-文件上传下载性能提升
在开发应用时,要实现高效的客户端跟服务器之间数据交换,文件传输的性能是至关重要的。一个数据交换性能较低的应用会导致其在加载过程中耗费较长时间,在很多的场景造成页面卡顿,极大的影响了用户体验。相反,一个数据交换高效的应用,则会让应用变得更加流畅。
小帅聊鸿蒙
2024/10/22
4060
鸿蒙(HarmonyOS)性能优化实战-文件上传下载性能提升
推荐阅读
相关推荐
springboot实战之文件分片上传、断点续传、秒传
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档