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

泰安北京网站建设公司哪家好正规的微信推广平台

泰安北京网站建设公司哪家好,正规的微信推广平台,程序开源网站,wordpress 比特币插件文章目录 前言思路hash计算上传(单文件) 前言 因为要写小组项目,其中涉及到了大文件的分片上传,之前进行了一些资料的参考 但是还是写了好几遍 这篇文章我先简单的介绍一下思路,以及一些最基本的核心代码 &#xff0c…

文章目录

  • 前言
  • 思路
    • hash计算
    • 上传(单文件)

前言

因为要写小组项目,其中涉及到了大文件的分片上传,之前进行了一些资料的参考 但是还是写了好几遍 这篇文章我先简单的介绍一下思路,以及一些最基本的核心代码 ,后续再进行一些优化

涉及技术:spark-md5 vue3

大文件之所以要分片上传 是因为服务器在处理大文件上传时,需要分配大量的内存和资源来接收和处理数据。如果一次性上传大文件,服务器可能会因为资源耗尽而出现性能下降甚至崩溃的情况。而分片上传将大文件分成多个小块,服务器可以逐块处理,每次处理的数据量相对较小,减轻了服务器的负载压力。例如,对于一台配置普通的服务器,一次性处理一个 10GB 的文件可能会让服务器不堪重负;但如果将该文件分成 1000 个 10MB 的分片,服务器处理起来就会轻松很多

思路

流程:首先前端拿到超大文件 需要把文件进行切割分成固定大小的切片,再通过http请求把所有的切片传给后端,后端拿到切片后,处理每一个切片并返回是否处理成功给前端,等吧所有切片上传后 后端吧所有切片合并成一个完整的文件,代表大文件上传完成
考虑要把文件切片 那么每一个文件的唯一标识可以用到spark-md5 去计算hash值,这样如果就算文件同名,那么它的唯一标识也会不同,文件内容更改后得到的hash值也会不同

hash计算

在向服务器上传文件时,需要区分不同的文件,但是肯定不能通过文件名进行区分,因为文件名是可以随意修改的,所以不能根据文件名区分,但是每一份文件内容都不一样,我们可以根据文件内容去区分

可以根据文件的内容产生一个唯一的hash值,那么就要通过一个工具spark-md5,具体安装过程就不说了
直接附上代码

function computeFileHash(file: File): Promise<any> {const spark = new SparkMD5.ArrayBuffer();const fileReader = new FileReader();return new Promise((resolve, reject) => {fileReader.onload = (e: ProgressEvent<FileReader>) => {const buffer = e.target?.result;spark.append(buffer as ArrayBuffer);const hash: string = spark.end();if (!buffer) reject();// 获取文件后缀const ext: string = file.name.split(".").pop() as string;resolve({hash,ext,});};fileReader.readAsArrayBuffer(file);});
}

hash就是计算出的md5值,有时候后端会要求md5值携带上文件的后缀

上传(单文件)

这个代码并没有进行过测试 只是根据网上视频写的demo,因为后端使用了minio服务器还需要进行一些操作

import axios from "axios";
import { reactive, ref } from "vue";
const percent = ref(0);
export async function uploadfile(e: Event, url: string, chunkSize: number) {//切片的大小let start =0 ;//开始位置let index=0 ;//切片索引const target = e.target as HTMLInputElement;if (target.files) {const file = target.files[0];//计算hashconst { hash, ext } = await computeFileHash(file);let object = `${hash}.${ext}`;let res = await runCheckChunk(object);//....进行res的判断 是否上传const { name, size, type } = reactive(file) ;while (start < size) {let blob = null;if (start + chunkSize > size) {//如果切片长度大于文件实际长度blob = file.slice(start, size); //从0开始切片段到size} else {//如果切片长度小于文件实际长度blob = file.slice(start, start + chunkSize); //每次只切片一个切片大小的文件}start += chunkSize; //切片片段的偏移量let blobFile = new File([blob], `${name}`); //创建一个blob文件来存取切片片段let formData = new FormData(); //创建一个formData对象formData.append("file", blobFile); //添加文件formData.append("index", index + ""); //添加文件索引await axios.post(url, formData); //上传文件片段index++;percent.value = (start / size) * 100; //进度条}// 合并文件片段await axios.post("/api/merge", {name: name,size: size,});percent.value = 100;}
}

后端需要的接口有:
1.前端传递hash值 后端返回文件的状态 是否已上传,若上传了一部分则返回上传的索引
2.上传切片的接口
3.合并切片的接口
常见切片大小是5MB及以上

  • 计算md5值后 传给后端获取返回的数据
  • 如果没有上传 则开始进行上传(循环传递)
  • 如果要进行切片的大小是大于文件大小的 则截取所需大小即可
  • 如果进行切片的大小小于文件大小 则截取切片大小
  • 每次截取过后 都需要将开始截取的位置后移
  • 传递的数据格式由后端决定(这里使用的是formData)
  • 把所有的放到formData后传递给后端
  • 最后进行合并操作

这里面的index的作用是为了断点续传 通过传递给后端索引值 当检查md5发现文件上传但是没有进行过合并操作 后端可以返回索引值 继续上传

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

相关文章:

  • 合肥网站建设合肥网站制作搜索引擎排名查询工具
  • 方案解决网站无锡百度信息流
  • dwcs2018怎么做动态网站seo关键词选取工具
  • wordpress自动博客插件电脑系统优化软件排行榜
  • 性价比最高网站建设电话站长seo综合查询工具
  • 网站产品展示代码站长之家怎么用
  • 自己家的电脑做网站需要备案没梅州网络推广
  • 免费网站服务器推荐关键词有哪些?
  • 自己电脑做主机怎么做网站windows优化
  • 省政府网站集约化建设方案青岛网站建设有限公司
  • 国内十大设计公司排名网站优化检测
  • 网站后台登录不进去上海网站排名seo公司
  • 售后服务方案 网站建设万江专业网站快速排名
  • 网站域名如何实名认证电脑系统优化工具
  • 音乐APP网站开发快推广app下载
  • 道滘做网站网站搭建服务
  • 百度站长工具域名查询window优化大师
  • 商业网站开发实训报告总结全球搜索
  • 深圳实力网站建设淘宝关键词搜索排行榜
  • 网络端游游戏排行榜北京seo公司
  • 后端网站开发十大收益最好的自媒体平台
  • 怎样提高网站流量seo综合查询系统
  • 武汉建设信息网站官网站外推广怎么做
  • o2o网站功能seo技术介绍
  • 东莞网站制作个性化中国十大外贸平台
  • 微信机器人网站开发北京seo站内优化
  • wordpress 远程插件安装 ftp站长之家seo一点询
  • 中国建设银行门户网站营销网页设计公司
  • 西海岸建设局网站手机百度下载
  • 做seo的网站网络营销的发展概述