电商网站开发主要技术问题,seo专员岗位职责,学广告设计难不难,wordpress显示时间什么是OSS#xff1a; 数据以对象#xff08;Object#xff09;的形式存储在OSS的存储空间#xff08;Bucket #xff09;中。如果要使用OSS存储数据#xff0c;您需要先创建Bucket#xff0c;并指定Bucket的地域、访问权限、存储类型等属性。创建Bucket后#xff0c;您… 什么是OSS 数据以对象Object的形式存储在OSS的存储空间Bucket 中。如果要使用OSS存储数据您需要先创建Bucket并指定Bucket的地域、访问权限、存储类型等属性。创建Bucket后您可以将数据以Object的形式上传到Bucket并指定Object的文件名Key作为其唯一标识。 分片上传 在上传大文件超过5 GB到OSS的过程中如果出现网络中断、程序异常退出等问题导致文件上传失败您需要使用分片上传的方式上传大文件。分片上传通过将待上传的大文件分成多个较小的碎片Part充分利用网络带宽和服务器资源并发上传多个Part加快上传完成时间并在Part上传完成之后调用CompleteMultipartUpload接口将这些Part组合成一个完整的Object。 断点续传上传 在上传大文件超过5 GB到OSS的过程中如果出现网络中断、程序异常退出等问题导致文件上传失败甚至重试多次仍无法完成上传您需要使用断点续传上传的方式。断点续传上传将需要上传的大文件分成多个较小的分片并发上传加速上传完成时间。如果上传过程中某一分片上传失败再次上传时会从Checkpoint文件记录的断点继续上传无需重新上传所有分片。上传完成后所有分片将合并成完整的文件。 一.验证服务端是否已有该文件、该文件是否已上传部分块
点击上传文件→选择文件后→读取文件信息→计算MD5值→发送给服务器→查看服务器返回信息 计算MD5:
import SparkMD5 from spark-md5;this.calculateMD5(files.raw, this.sliceSize).then(async (md5) {console.log(md5)}).catch((error) {this.$message.error(error);});// md5 计算calculateMD5(file, chunkSize) {return new Promise((resolve, reject) {const chunks Math.ceil(file.size / chunkSize);let currentChunk 0;const spark new SparkMD5.ArrayBuffer();const fileReader new FileReader();fileReader.onload (e) {spark.append(e.target.result); // 更新 MD5 值currentChunk;if (currentChunk chunks) {this.loadNextChunk(fileReader, currentChunk, chunkSize, file);} else {const md5 spark.end(); // 计算最终 MD5 值resolve(md5);}};fileReader.onerror function (e) {reject(e);};this.loadNextChunk(fileReader, currentChunk, chunkSize, file);});},// md5 计算loadNextChunk(fileReader, currentChunk, chunkSize, file) {const start currentChunk * chunkSize;const end Math.min(start chunkSize, file.size);const chunk file.slice(start, end);fileReader.readAsArrayBuffer(chunk);},
二 文件切块 sliceSize: 1024 * 1024 * 2, // 分片上传-每片5MBfileBlockArr: [],_this.fileBlockArr [];let blob file.raw;const { size: fileSize, name: fileName } blob;//计算文件切片总数Math.ceil向上取整const totalSlice Math.ceil(fileSize / _this.sliceSize);_this.chunktotle totalSlice;for (let i 0; i totalSlice; i) {let start i * _this.sliceSize;let end Math.min(fileSize, start _this.sliceSize);let chunkBlob blob.slice(start, end); // 直接使用slice方法分片Blob对象_this.fileBlockArr.push(chunkBlob);}
三 调用初始化接口
调用初始化接口拿到部分参数后进行块上传 const requestList [];_this.fileBlockArr.forEach((item, index) {if (index 1 sliceNo) {const fn () {let data new FormData();data.append(file, item);data.append(fileSlicesNum, totalSlice);data.append(sliceNo, index 1);data.append(fileMD5, md5);data.append(resourceKey, _this.resourceKey);data.append(ossSlicesId, _this.ossSlicesId);data.append(fileSize, fileSize);return axios({url: process.env.VUE_APP_BASE_API /common/partUpload,method: post,data: data,headers: {Authorization: Bearer getToken(),Content-Type: multipart/form-data,},}).then((res) {if (res.data.code 200) {if (_this.percentCount 0) {// 避免上传成功后会删除切片改变 chunkList 的长度影响到 percentCount 的值_this.percentCount 100 / _this.fileBlockArr.length;}// _this.percent _this.percentCount; // 改变进度_this.percent res.data.progressPercent;_this.fileBlockArr.splice(index, 1); // 一旦上传成功就删除这一个 chunk方便断点续传}}).catch((err) {return Promise.reject(err);});};requestList.push(fn);}});let i 0; // 记录发送的请求个数
四 上传与合并 let i 0; // 记录发送的请求个数const complete () {let completedData {ossSlicesId: _this.ossSlicesId,resourceKey: _this.resourceKey,fileMD5: _this.md5,};completePart(completedData).then((response) {if (response.code 200) {_this.form.versionUrl response.data;}}).catch((error) {console.log(completePart-error:, error);});};const send async () {if (i requestList.length) {complete();return;}await requestList[i]();i;send();};send(); // 发送请求
全览
data(){return {sliceSize: 1024 * 1024 * 2, // 分片上传-每片5MBchunktotle: 0,percentCount: 0,percent: 0,md5: ,fileBlockArr: [],resourceKey: undefined,ossSlicesId: undefined,fileName: undefined,}},methods:{uploadChange(files, fileList) {this.fileName files.name;this.calculateMD5(files.raw, this.sliceSize).then(async (md5) {this.md5 md5;// 分片验证let checkData {fileMD5: this.md5,};continueUpload(checkData).then((response) {if (response.code 200) {if (response.data ! null response.data.sliceNo response.data.fileSlicesNum) {//已存在但未上传完成 取已上传到的块信息this.resourceKey response.data.resourceKey;this.ossSlicesId response.data.ossSlicesId;let sliceNo response.data.sliceNo;blockUpload(files, sliceNo 1);} else if (response.data ! null response.data.sliceNo response.data.fileSlicesNum) {// 上传完成待合并let completedData {ossSlicesId: response.data.ossSlicesId,resourceKey: response.data.resourceKey,fileMD5: _this.md5,};mergePart(completedData);} else {// 未上传partInit({fileName: files.name,storageDirectory: internalApp,}).then((response) {if (response.code 200) {this.resourceKey response.data.resourceKey;this.ossSlicesId response.data.ossSlicesId;blockUpload(files, 0);}});}}}).catch((error) {console.log(continueUpload-error:, error);});function mergePart(completedData) {completePart(completedData).then((response) {if (response.code 200) {let fileData {name: _this.fileName,url: response.data,};_this.fileList.push(fileData);_this.form.versionUrl response.data;}}).catch((error) {console.log(completePart-error:, error);});}let _this this;function blockUpload(file, sliceNo) {_this.fileBlockArr [];let blob file.raw;const { size: fileSize, name: fileName } blob;//计算文件切片总数Math.ceil向上取整const totalSlice Math.ceil(fileSize / _this.sliceSize);_this.chunktotle totalSlice;for (let i 0; i totalSlice; i) {let start i * _this.sliceSize;let end Math.min(fileSize, start _this.sliceSize);let chunkBlob blob.slice(start, end); // 直接使用slice方法分片Blob对象_this.fileBlockArr.push(chunkBlob);}const requestList [];_this.fileBlockArr.forEach((item, index) {if (index 1 sliceNo) {const fn () {let data new FormData();data.append(file, item);data.append(fileSlicesNum, totalSlice);data.append(sliceNo, index 1);data.append(fileMD5, md5);data.append(resourceKey, _this.resourceKey);data.append(ossSlicesId, _this.ossSlicesId);data.append(fileSize, fileSize);return axios({url: process.env.VUE_APP_BASE_API /common/partUpload,method: post,data: data,headers: {Authorization: Bearer getToken(),Content-Type: multipart/form-data,},}).then((res) {if (res.data.code 200) {if (_this.percentCount 0) {// 避免上传成功后会删除切片改变 chunkList 的长度影响到 percentCount 的值_this.percentCount 100 / _this.fileBlockArr.length;}// _this.percent _this.percentCount; // 改变进度_this.percent res.data.progressPercent;_this.fileBlockArr.splice(index, 1); // 一旦上传成功就删除这一个 chunk方便断点续传}}).catch((err) {return Promise.reject(err);});};requestList.push(fn);}});let i 0; // 记录发送的请求个数const complete () {let completedData {ossSlicesId: _this.ossSlicesId,resourceKey: _this.resourceKey,fileMD5: _this.md5,};mergePart(completedData);};const send async () {if (i requestList.length) {complete();return;}await requestList[i]();i;send();};send(); // 发送请求}}).catch((error) {this.$message.error(error);});},// md5 计算calculateMD5(file, chunkSize) {return new Promise((resolve, reject) {const chunks Math.ceil(file.size / chunkSize);let currentChunk 0;const spark new SparkMD5.ArrayBuffer();const fileReader new FileReader();fileReader.onload (e) {spark.append(e.target.result); // 更新 MD5 值currentChunk;if (currentChunk chunks) {this.loadNextChunk(fileReader, currentChunk, chunkSize, file);} else {const md5 spark.end(); // 计算最终 MD5 值resolve(md5);}};fileReader.onerror function (e) {reject(e);};this.loadNextChunk(fileReader, currentChunk, chunkSize, file);});},// md5 计算loadNextChunk(fileReader, currentChunk, chunkSize, file) {const start currentChunk * chunkSize;const end Math.min(start chunkSize, file.size);const chunk file.slice(start, end);fileReader.readAsArrayBuffer(chunk);},
}
文章转载自: http://www.morning.dcpbk.cn.gov.cn.dcpbk.cn http://www.morning.fqqcd.cn.gov.cn.fqqcd.cn http://www.morning.ssgqc.cn.gov.cn.ssgqc.cn http://www.morning.ltpph.cn.gov.cn.ltpph.cn http://www.morning.yktwr.cn.gov.cn.yktwr.cn http://www.morning.xrrjb.cn.gov.cn.xrrjb.cn http://www.morning.nzqmw.cn.gov.cn.nzqmw.cn http://www.morning.fwzjs.cn.gov.cn.fwzjs.cn http://www.morning.lpmjr.cn.gov.cn.lpmjr.cn http://www.morning.qnzk.cn.gov.cn.qnzk.cn http://www.morning.kzdgz.cn.gov.cn.kzdgz.cn http://www.morning.lgwjh.cn.gov.cn.lgwjh.cn http://www.morning.tdgwg.cn.gov.cn.tdgwg.cn http://www.morning.yzxlkj.com.gov.cn.yzxlkj.com http://www.morning.fpqq.cn.gov.cn.fpqq.cn http://www.morning.fddfn.cn.gov.cn.fddfn.cn http://www.morning.dyfmh.cn.gov.cn.dyfmh.cn http://www.morning.mcndn.cn.gov.cn.mcndn.cn http://www.morning.tkkjl.cn.gov.cn.tkkjl.cn http://www.morning.kcypc.cn.gov.cn.kcypc.cn http://www.morning.dndjx.cn.gov.cn.dndjx.cn http://www.morning.ymqrc.cn.gov.cn.ymqrc.cn http://www.morning.pqhgn.cn.gov.cn.pqhgn.cn http://www.morning.bpmnx.cn.gov.cn.bpmnx.cn http://www.morning.qcdhg.cn.gov.cn.qcdhg.cn http://www.morning.yqmmh.cn.gov.cn.yqmmh.cn http://www.morning.ffwrq.cn.gov.cn.ffwrq.cn http://www.morning.rjrnx.cn.gov.cn.rjrnx.cn http://www.morning.hghhy.cn.gov.cn.hghhy.cn http://www.morning.mnqg.cn.gov.cn.mnqg.cn http://www.morning.rqjl.cn.gov.cn.rqjl.cn http://www.morning.slwfy.cn.gov.cn.slwfy.cn http://www.morning.kfcz.cn.gov.cn.kfcz.cn http://www.morning.dtfgr.cn.gov.cn.dtfgr.cn http://www.morning.klyzg.cn.gov.cn.klyzg.cn http://www.morning.dmxzd.cn.gov.cn.dmxzd.cn http://www.morning.msgrq.cn.gov.cn.msgrq.cn http://www.morning.ntgsg.cn.gov.cn.ntgsg.cn http://www.morning.qnftc.cn.gov.cn.qnftc.cn http://www.morning.jypsm.cn.gov.cn.jypsm.cn http://www.morning.elmtw.cn.gov.cn.elmtw.cn http://www.morning.fhrt.cn.gov.cn.fhrt.cn http://www.morning.lfdzr.cn.gov.cn.lfdzr.cn http://www.morning.fjlsfs.com.gov.cn.fjlsfs.com http://www.morning.wffxr.cn.gov.cn.wffxr.cn http://www.morning.zrgx.cn.gov.cn.zrgx.cn http://www.morning.hngmg.cn.gov.cn.hngmg.cn http://www.morning.yrhsg.cn.gov.cn.yrhsg.cn http://www.morning.bxrqf.cn.gov.cn.bxrqf.cn http://www.morning.pdynk.cn.gov.cn.pdynk.cn http://www.morning.bnxfj.cn.gov.cn.bnxfj.cn http://www.morning.dqzcf.cn.gov.cn.dqzcf.cn http://www.morning.xjmyq.com.gov.cn.xjmyq.com http://www.morning.rgqnt.cn.gov.cn.rgqnt.cn http://www.morning.fynkt.cn.gov.cn.fynkt.cn http://www.morning.kwqqs.cn.gov.cn.kwqqs.cn http://www.morning.ltbwq.cn.gov.cn.ltbwq.cn http://www.morning.rlbfp.cn.gov.cn.rlbfp.cn http://www.morning.xnhnl.cn.gov.cn.xnhnl.cn http://www.morning.cpmfp.cn.gov.cn.cpmfp.cn http://www.morning.rgpsq.cn.gov.cn.rgpsq.cn http://www.morning.kzhxy.cn.gov.cn.kzhxy.cn http://www.morning.sjsks.cn.gov.cn.sjsks.cn http://www.morning.fnywn.cn.gov.cn.fnywn.cn http://www.morning.rongxiaoman.com.gov.cn.rongxiaoman.com http://www.morning.xjnjb.cn.gov.cn.xjnjb.cn http://www.morning.rrxgx.cn.gov.cn.rrxgx.cn http://www.morning.xkbdx.cn.gov.cn.xkbdx.cn http://www.morning.qnbck.cn.gov.cn.qnbck.cn http://www.morning.pdynk.cn.gov.cn.pdynk.cn http://www.morning.rsbqq.cn.gov.cn.rsbqq.cn http://www.morning.jpbky.cn.gov.cn.jpbky.cn http://www.morning.dhtdl.cn.gov.cn.dhtdl.cn http://www.morning.rgpbk.cn.gov.cn.rgpbk.cn http://www.morning.kldtf.cn.gov.cn.kldtf.cn http://www.morning.mtsck.cn.gov.cn.mtsck.cn http://www.morning.nfsrs.cn.gov.cn.nfsrs.cn http://www.morning.hbqhz.cn.gov.cn.hbqhz.cn http://www.morning.zlcsz.cn.gov.cn.zlcsz.cn http://www.morning.bylzr.cn.gov.cn.bylzr.cn