当前位置: 首页 > wzjs >正文

网站建设电话营销推广

网站建设电话,营销推广,360挂靠建筑网中介,做网站卖衣服物流包年多少钱文章目录 Softhub软件下载站实战开发(十三):软件管理前端分片上传实现 🚀前言前端分片上传架构设计 🏗️核心组件实现 💻1. 上传资源组件 (uploadResource.vue)2. 分片上传逻辑实现3. 资源管理组件 (editRe…

文章目录

  • Softhub软件下载站实战开发(十三):软件管理前端分片上传实现 🚀
    • 前言
    • 前端分片上传架构设计 🏗️
    • 核心组件实现 💻
      • 1. 上传资源组件 (`uploadResource.vue`)
      • 2. 分片上传逻辑实现
      • 3. 资源管理组件 (`editResource.vue`)
    • 文件大小格式化组件 📏
    • 大整数处理方案 🔢
    • 总结 🎯

Softhub软件下载站实战开发(十三):软件管理前端分片上传实现 🚀

前言

在之前文章中,我们实现了软件分片上传的后端接口。本文将聚焦于前端分片上传的实现,详细介绍如何使用Vue3和Element Plus构建一个高效、稳定的文件上传组件,并与后端分片上传接口进行对接。

前端分片上传架构设计 🏗️

前端分片上传主要分为三个步骤:

  1. 文件选择与分片准备
  2. 分片上传过程
  3. 上传完成与合并
用户选择文件
初始化上传
分片文件
上传分片
所有分片上传完成?
合并分片
上传完成

核心组件实现 💻

1. 上传资源组件 (uploadResource.vue)

这是用户上传文件的入口组件,主要功能是文件选择和初步信息收集。

<template><el-uploadclass="upload-demo"drag:auto-upload="false":on-change="handleFileChange":limit="1":file-list="fileList"><el-icon class="el-icon--upload"><upload-filled /></el-icon><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div></el-upload>
</template><script setup>
const handleFileChange = (file) => {// 从文件名中自动提取版本号const versionMatch = file.name.match(/[vV]?(\d+\.\d+\.\d+)/);formData.version = versionMatch ? versionMatch[1] : '';// 设置默认资源名称formData.resourceName = file.name;formData.file = file.raw;
}
</script>

2. 分片上传逻辑实现

在确认上传后,组件会执行以下分片上传流程:

用户界面 前端代码 后端API 点击上传按钮 初始化上传(文件信息) 返回uploadId 分割文件为5MB分片 上传分片n 返回结果 更新进度条 loop [分片上传] 合并分片请求 返回最终结果 显示上传成功 用户界面 前端代码 后端API

关键代码实现:

// 创建文件分片
const createFileChunks = (file: File) => {const chunks = [];let cur = 0;while (cur < file.size) {chunks.push({index: chunks.length,file: file.slice(cur, cur + CHUNK_SIZE)});cur += CHUNK_SIZE;}return chunks;
};// 上传分片
const uploadChunkFile = async (chunk, uploadId) => {const formDataObj = new FormData();formDataObj.append('file', chunk.file);formDataObj.append('uploadId', uploadId);formDataObj.append('chunkIndex', String(chunk.index));formDataObj.append('fileName', formData.file!.name);formDataObj.append('softwareId', String(props.softwareId));await uploadChunk(formDataObj);
};// 完整上传流程
const onConfirm = async () => {// 初始化上传const initResponse = await initChunkUpload({softwareId: props.softwareId,fileName: formData.file.name,fileSize: formData.file.size,chunkSize: CHUNK_SIZE});const uploadId = initResponse.data.data.uploadId;// 创建分片const chunks = createFileChunks(formData.file);// 显示进度条const loadingInstance = ElLoading.service({text: '正在上传文件... 0%'});// 上传所有分片for (let i = 0; i < chunks.length; i++) {await uploadChunkFile(chunks[i], uploadId);const progress = Math.round(((i + 1) / chunks.length) * 100);loadingInstance.setText(`正在上传文件... ${progress}%`);}// 合并分片await mergeChunks({uploadId,softwareId: props.softwareId,resourceName: formData.resourceName,version: formData.version,remark: formData.remark});loadingInstance.close();ElMessage.success('上传成功');
};

3. 资源管理组件 (editResource.vue)

这个组件提供了已上传资源的管理界面,包括:

  • 资源列表展示
  • 设置默认版本
  • 资源删除
  • 资源下载
<template><el-table :data="tableData.data"><el-table-column prop="resourceName" label="软件名称"/><el-table-column prop="size" label="资源大小"><template #default="scope"><FormattedSize :sizeInBytes="scope.row.size" /></template></el-table-column><el-table-column prop="default" label="是否默认"><template #default="scope"><el-switch v-model="scope.row.default" @click="onSwitchDefault(scope.row)" /></template></el-table-column><el-table-column label="操作"><template #default="scope"><el-button @click="onRowDownload(scope.row)">下载</el-button><el-button @click="openManageResourceDialog(scope.row, 'edit')">修改</el-button><el-button @click="onRowDel(scope.row)">删除</el-button></template></el-table-column></el-table>
</template>

文件大小格式化组件 📏

为了方便显示文件大小,我们创建了一个专用的格式化组件:

<template>{{ formattedSize }}
</template><script setup>
const formattedSize = computed(() => {const bytes = sizeInBytes.value;if (bytes === 0) return '0 Bytes';const k = 1024;const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];const i = Math.floor(Math.log(bytes) / Math.log(k));return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
});
</script>

大整数处理方案 🔢

由于我们使用雪花算法生成ID,前端需要特殊处理大整数:

/*** 将大整数转换为字符串,避免精度丢失* @param value 要转换的值* @returns 字符串形式的大整数*/
export function toBigIntString(value) {if (value === null || value === undefined) {return '0';}// 如果已经是字符串,直接返回if (typeof value === 'string') {return value;}// 如果是数字,检查是否超过安全整数范围if (typeof value === 'number') {if (Number.isSafeInteger(value)) {return value.toString();} else {// 超过安全整数范围,使用BigInttry {return BigInt(value).toString();} catch (error) {console.error('BigInt转换失败:', error);return value.toString();}}}// 其他类型,尝试转换为字符串try {return BigInt(value).toString();} catch (error) {console.error('BigInt转换失败:', error);return String(value);}
}

总结 🎯

通过本文的实现,我们完成了Softhub软件下载站的前端分片上传功能。关键点包括:

  • 使用Element Plus构建友好的上传界面
  • 实现高效的分片上传逻辑
  • 处理大整数ID问题
  • 提供完善的进度反馈和错误处理

这套方案不仅适用于软件下载站,也可以应用于任何需要大文件上传的场景,如视频平台、云存储服务等。

http://www.dtcms.com/wzjs/273884.html

相关文章:

  • 滕州住房城乡建设局网站搜索引擎广告案例
  • 微信公众号开发平台聊城优化seo
  • react做的电商网站能上线吗合肥正规的seo公司
  • 大学生做网站赚钱seo推广网址
  • 电商网站如何避免客户信息泄露介绍网络营销的短文
  • 北京网站关键字优化百度自媒体平台
  • 桂林做网站建设的公司优化防控举措
  • 建设网站要求怎样优化标题关键词
  • 网站建设的目标和需求分析百度打广告怎么收费
  • 广州优俊网站制作公司关键词分类
  • win10 电脑做网站服务器吗郑州关键词优化顾问
  • 建设网站有哪些目的关键词优化外包
  • 东莞外贸网站建设青岛网站建设制作公司
  • 做网站需要公司授权嘛镇江seo快速排名
  • psd网站巨量算数数据分析
  • 做saas网站可行吗如何做网络推广赚钱
  • 程序员做项目的网站百家号权重查询站长工具
  • 福建做网站干净无广告的搜索引擎
  • 电子商务公司网站模版百度seo关键词优化排行
  • 适合友情链接的网站今日新闻摘抄50字
  • 朔州做网站的公司网络营销的发展概述
  • 微信做网站免费手机网页制作
  • 平面ui设计网站短视频运营方案策划书
  • 做360网站中保存的图片存在哪里奖券世界推广网站
  • 老师用什么网站做ppt怎么做好市场宣传和推广
  • 网站注册平台怎么注册优化公司
  • 怎么给自己网站做推广网站seo优化培训
  • 网络推广服务投诉石家庄seo网络优化的公司
  • 杭州企业网站免费域名注册永久
  • 朋友圈网站文章怎么做的百度快照怎么用