上传文件worker

基于Minio与Web Worker的现代前端大文件上传架构实践 本文详细介绍了基于Minio与Web Worker的现代前端大文件上传架构实践,通过大文件切片上传、断点续传和秒传技术,有效解决了传统上传方式在网络不稳定、浏览器卡顿和服务器压力大等问题。文章包含前后端实现细节、性能优化策略及安全注意事项,为开发者提供了一套完整的高效文件上传解决方案。 阅读详情
class UploadWorker(
    context: Context,
    params: WorkerParameters
) : CoroutineWorker(context, params) {

    companion object {
        private const val PRESIGNED_URL = "PRESIGNED_URL"
        private const val FILE_PATH = "FILE_PATH"
        private const val ATTEMPT_COUNT = "ATTEMPT_COUNT"
        private const val MAX_ATTEMPT = 3
        fun addUploadTask(
            context: Context,
            preUrl: String,
            filePath: String,
            attemptCount: Int = 1
        ) {
            LogUtils.d("UploadWorker addUploadTask $filePath")
            // 构建输入参数
            val inputData = Data.Builder()
                .putString(PRESIGNED_URL, preUrl)
                .putString(FILE_PATH, filePath)
                .putInt(ATTEMPT_COUNT, attemptCount)
                .build()
            // 创建 WorkRequest
            val constraints = Constraints.Builder()
                .setRequiredNetworkType(NetworkType.CONNECTED)
                .build()
            val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
                .setInputData(inputData)
                .setConstraints(constraints)
                .build()
            // 提交任务
            WorkManager.getInstance(context).enqueue(uploadWorkRequest)
        }
    }

    override suspend fun doWork(): Result {
        // 从输入参数中获取预签名 URL 和文件路径
        val presignedUrl = inputData.getString(PRESIGNED_URL) ?: return Result.failure()
        val filePath = inputData.getString(FILE_PATH) ?: return Result.failure()
        val attempt = inputData.getInt(ATTEMPT_COUNT, 1) // 默认从第一次开始
        LogUtils.d("UploadWorker addUploadTask doWork attempt=$attempt")
        return try {
            val file = File(filePath)
            val client = OkHttpClient()
            val request = Request.Builder()
                .url(presignedUrl)
                .put(file.asRequestBody("text/plain".toMediaType()))
                .build()

            val response = client.newCall(request).execute()
            LogUtils.d("UploadWorker addUploadTask doWork response=$response")
            if (response.isSuccessful) {
                file.delete()
                Result.success()
            } else {
                deleteOrRetry(attempt,filePath,presignedUrl)
                Result.failure()
            }
        } catch (e: Exception) {
            e.printStackTrace()
            deleteOrRetry(attempt,filePath,presignedUrl)
            Result.failure()
        }
    }

    private fun deleteOrRetry(attemptCount: Int,filePath: String,preUrl: String,){
        if (attemptCount < MAX_ATTEMPT) {
            addUploadTask(applicationContext, preUrl, filePath, attemptCount + 1)
        } else {
            deleteFile(filePath)
        }
    }

    private fun deleteFile(filePath:String){
        try {
            val file = File(filePath)
            if (file.exists()) file.delete()
        }catch (e:Exception){
            e.printStackTrace()
        }
    }
}

如果文件很大,大到一个什么范围需要分段上传呢?

  • 内存压力:大文件在上传时如果全部加载进内存,容易造成 OOM(Out of Memory)。

  • 上传稳定性:网络中断时,如果是整个文件上传,一旦失败就要重头再来,耗时耗流量。

  • 可控性更强:可以做断点续传、上传进度监控、更好地用户体验。

  • <10MB:直接上传通常没问题

  • 10MB - 50MB:需要视设备内存情况和网络稳定性决定

  • >50MB:推荐强烈使用分段上传

class StreamingFileRequestBody(
    private val file: File,
    private val contentType: MediaType,
    private val bufferSize: Int = DEFAULT_BUFFER_SIZE // 可自定义缓存大小
) : RequestBody() {

    override fun contentType(): MediaType = contentType

    override fun contentLength(): Long = file.length()

    override fun writeTo(sink: BufferedSink) {
        file.inputStream().use { input ->
            val buffer = ByteArray(bufferSize)
            var bytesRead: Int
            while (input.read(buffer).also { bytesRead = it } >= 0) {
                sink.write(buffer, 0, bytesRead)
            }
        }
    }
}
val request = Request.Builder()
    .url(presignedUrl)
    .put(
        StreamingFileRequestBody(
            file = file,
            contentType = "application/octet-stream".toMediaType(),
            bufferSize = 8192 // 8KB buffer,默认就很合理
        )
    )
    .build()

val response = OkHttpClient().newCall(request).execute()

基于Minio与Web Worker构建企业级大文件上传解决方案 本文详细介绍了基于Minio与Web Worker构建企业级大文件上传解决方案,重点解决大文件切片上传、断点续传和秒传等核心问题。通过Minio的高性能对象存储和Web Worker的多线程能力,实现了稳定高效的大文件上传,提升用户体验和系统可靠性。 阅读详情

相关推荐

Web Worker实战:大文件分片上传与前端性能优化方案

在前端开发中,处理复杂计算任务时,主线程阻塞是导致页面卡顿和用户体验下降的常见性能瓶颈。Web Worker技术通过创建独立的后台线程,允许JavaScript在不阻塞UI渲染的情况下执行密集型计算,其核心原理是基于消息传递机制实现主线程与Worker线程间的安全通信。这项技术的核心价值在于解放主线程,显著提升应用响应速度和交互流畅度,尤其适用于数据处理、文件操作和实时计算等场景。本文聚焦于利用Worker技术优化大文件上传流程,通过分片处理和哈希计算,构建高效、可复用的前端解决方案,其中涉及文件分片、MD

weixin_27960253的博客 253

web-worker应用在大文件切片上传

Web Worker是Web浏览器提供的一种在后台线程中运行JavaScript的功能。它独立于主线程运行,可以执行计算密集型或长时间运行的任务,而不会阻塞页面的渲染和交互。通过将大文件切片上传的逻辑放在Web Worker中执行,我们可以充分利用浏览器的多线程能力,提高上传速度,并保持页面的流畅运行。

m0_74823490的博客 1477

基于Web Worker与国密算法的大文件分片加密上传方案

在现代Web应用中,大文件上传是一个常见且具有挑战性的需求。其核心原理是通过分片技术,将大文件切割成多个小块进行传输,从而解决浏览器内存限制、网络超时和提升传输可靠性。结合断点续传机制,能有效应对网络不稳定的场景,保障用户体验。从技术价值看,这不仅是性能优化,更是构建健壮性应用的关键。当涉及敏感数据时,传输安全成为重中之重,国密算法(SM2/SM3/SM4)作为我国自主密码标准,为数据传输的机密性、完整性和合规性提供了保障。将国密算法集成到前端分片上传流程中,实现了从浏览器端开始的端到端加密。本文聚焦于**

weixin_28568819的博客 315

Web Worker实现大文件上传

Web Worker实现大文件分片上传解决js计算使页面卡顿的解决方案

Allen_kai_hui的博客 1926

JS利用Worker多线程大文件切片上传

在做前端上传时,会遇到上传大文件,大文件就要进行分片上传,我们整理下思路,实现一个分片上传,最终我们要拿到每一个分片的值, 分片索引,以及分片: 我们先创建一个文件,用于处理选择文件,进而分片,这里利用获取文件hash值 : 默认一个分片5M,这里要向上取整,计算出分片数量 然后循环处理 对文件进行切片,利用对文件进行切片处理 可以看到,切为若干份 然后获取切片的值,最终返回 然后对返回的结果进行批处理,这里我们可以打印下处理的时间 可以看到,处理了4秒左右,主要是花费在处理文件上,获取文件为同步任务,且

一只路过的小码农 2880

CVAT本地部署保姆级教程:用Docker Compose在Ubuntu上5分钟搞定你的私有数据标注平台

本文提供CVAT本地部署的保姆级教程,详细讲解如何在Ubuntu系统上使用Docker Compose快速搭建私有数据标注平台。从环境准备、Docker配置到CVAT部署全流程,涵盖硬件要求、性能优化及安全加固等关键步骤,帮助开发团队5分钟内完成高效、安全的标注环境搭建。

weixin_42619742的博客 383

Web-Worker的基本用法并进行大文件切片上传(附带简易Node后端)

Web Worker是Web浏览器提供的一种在后台线程中运行JavaScript的功能。它独立于主线程运行,可以执行计算密集型或长时间运行的任务,而不会阻塞页面的渲染和交互。通过将大文件切片上传的逻辑放在Web Worker中执行,我们可以充分利用浏览器的多线程能力,提高上传速度,并保持页面的流畅运行。

cxz 1258

九齐NY8B062F单片机:12位ADC与4路PWM在智能家居控制中的实战应用

本文详细介绍了九齐NY8B062F单片机在智能家居控制中的实战应用,重点解析其12位ADC高精度传感器数据采集和4路PWM精准驱动技术。通过实际案例展示如何利用该单片机实现温湿度监测、灯光调节及电机控制,并分享低功耗设计与抗干扰方案,为低成本高可靠性的智能家居设备开发提供完整解决方案。

rnn9storyteller的博客 733

利用Web Worker计算文件分片Hash,优化上传效率

多线程并发控制可以维护一个任务队列,在hash-worker计算完成后的返回的每个分片hash时检查是否超过最大上传数,如果没有立即上传,如果超过了则push入任务队列。(有上传并发超过最大上传数的风险,但因为hash-worker是串行的,风险不大)该组件通过文件分片、Web Worker 计算哈希值和分片上传,实现了高效、可靠的视频上传功能。这种设计不仅提高了上传效率,还通过分片上传和哈希验证增强了文件上传的可靠性。:哈希计算完成后立即上传分片,无需等待所有分片处理完成。验证文件是否为视频格式(通过。

weixin_70070804的博客 581

Win10 开机突然蓝屏错误代码0xc0000001安全模式也进不了,不用重装系统怎么修复?(已解决)九个解决参考方案

Win 10专业版HP480G7。

本博客,博文仅代表个人操作经验,不能完全解决你的问题,仅供参考,佛系回复。 1万+

【总结】2249- Web-Worker的基本用法并进行大文件切片上传

原文链接: https://juejin.cn/post/7351300892572745764作者:大码猴在Web应用中,文件上传是一项常见的功能。然而,当文件体积过大时,传统的文件上传方式往往会导致页面卡顿,用户体验不佳。为了解决这一问题,我们可以利用Web Worker技术来进行大文件的切片上传。本文将详细介绍如何使用Web Worker进行大文件切片上传,并通过具体的例子来演示其实现过程。...

pingan8787 249

Nmap源码分析(端口扫描)

端口扫描是Nmap的核心功能,用于确定目标机的端口状态(开放、关闭、过滤等),也为Nmap的服务与版本扫描、OS扫描、脚本扫描提供基本的指引信息。所以,深入理解端口扫描的实现对分析其他的扫描方式很有帮助。 1简单回顾   首先简要回顾一下端口扫描的原理以及命令行选项。 1.1扫描原理   Nmap提供的10多种类型的端口扫描方法,如TCP SYN/ACK/FIN/Xmas/NULL/ Windows/Connect,FTP Bounce, Idle scan, UDP port u...

墨痕诉清风的博客 1599

大文件上传之多线程(Worker)分片

大文件分片之多线程分片

Guojun19900715的博客 443

基于STM32的智能电子秤设计毕业论文

摘要:本文设计了一款基于STM32F103C8T6的智能电子秤系统,通过HX711称重传感器实现高精度测量,采用OLED显示和矩阵键盘完成人机交互。系统包含重量采集、数据处理、单价设置、去皮清零及总价计算等功能模块,经测试测量误差小于0.1%,稳定性良好。研究实现了低成本、高可靠性的智能称重方案,为后续无线传输和AI算法集成奠定了基础。关键词:STM32;智能电子秤;HX711;OLED显示;矩阵键盘。

3254968421的博客 851

从入门到精通|Yalmip+Cplex在电力系统中的应用(Matlab代码实现)

​ 火电成本包括运行成本、碳捕集成本,其中火电运行成本由运行维护成 本和发电煤耗成本构成,发电煤耗与其出力关系: ,F 为机组煤耗量(kg/h),P 为机组出力/MW;运行维护成本按照 0.5 倍煤耗成本考虑,碳捕集成本取决于碳排放量及碳捕集单价,火电机组相关参数如附表 1 所示,电煤价格为 700 元/t ​

weixin_46039719的博客 1553

Web Worker 实战:从零实现支持秒传的大文件分片上传方案

可以传的数据类型包括:Object、Array、String、Number、Map / Set、ArrayBuffer、TypedArray、File / Blob。所有 DOM 渲染、事件响应、动画都在主线程、一旦你执行大量计算 → 页面卡死。改成 Worker 后:计算在子线程执行、UI 依然流畅、用户体验巨大提升。条件不再满足而退出),老板才会说:“好,全文件上传任务圆满结束!不能传:DOM、window、document、function。

m0_73723572的博客 901

Win11极速安装Tensorflow-gpu+CUDA+cudnn(含视频)

Win11极速安装Tensorflow-gpu+CUDA+cudnn(含视频链接)

weixin_46713695的博客 1万+

【前端】大文件切片上传性能优化 使用 web worker 多线程

代码 vue js 都可用。引用线程 指定线程数。

我是Superman丶的博客 1565

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大文件上传实战:基于Express、分片、Web Worker与压缩的完整方案

本文将详细介绍大文件上传的全链路优化方案,结合前端分片、Web Worker多线程处理、文件压缩以及Express后端实现,解决传统大文件上传中的网络波动、服务器压力与用户体验差等核心痛点。文件→分片(5MB/片,共约400片)→Web Worker计算分片哈希(4线程并行)→gzip压缩(体积减少约40%)。实际应用中,可根据文件类型调整分片大小(如图片用2MB,视频用5MB),并监控服务器负载以优化并发参数。:采用分片(5MB/片)压缩后,通过Web Worker计算哈希,实现并发上传与进度反馈。

wujiayu31415的博客 767

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

前端大文件上传 - 总结(Vue3 + hook + Web Worker实现,通过多个Worker线程大大提高Hash计算的速度)

前端大文件上传 - 总结(Vue3 + hook + Web Worker实现,通过多个Worker线程大大提高Hash计算的速度)

qq_41068362的博客 3497

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【大文件上传】分片上传+断点续传+Worker线程计算Hash

摘要 该代码实现了一个文件分片上传管理器,主要功能包括: 分片上传:将大文件按指定大小(默认5MB)切分为多个分片 并发控制:支持配置最大并发上传数(默认3个并发) 断点续传:记录已上传分片,支持从断点处继续上传 文件哈希校验:使用Web Worker计算文件哈希,实现秒传功能 错误处理:包含重试机制和详细的错误上报 核心流程包括:计算文件哈希→检查秒传→获取上传进度→并发上传分片→最终完成上传。该方案适用于大文件上传场景,提高了上传效率和可靠性。

Li_Ning21的博客 277
上一篇: 通过uri获取文件路径手机适配
下一篇: 根据Exif信息纠正图片方向
lynn8570_blog
博客等级 码龄10年 254粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值