@jingoz/file-slicer
Version:
@jingoz/file-slicer 是一个 npm 包,提供了文件根据自定义大小分片并计算 hash 的功能。
2 lines (1 loc) • 2.48 kB
JavaScript
(function(i,t){typeof exports=="object"&&typeof module<"u"?t(exports):typeof define=="function"&&define.amd?define(["exports"],t):(i=typeof globalThis<"u"?globalThis:i||self,t(i.fileSlicer={}))})(this,function(i){"use strict";var H=Object.defineProperty;var k=(i,t,o)=>t in i?H(i,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):i[t]=o;var c=(i,t,o)=>k(i,typeof t!="symbol"?t+"":t,o);class t{constructor(e){c(this,"_fileHash","");this._file=e}get fullHash(){return this._fileHash}get fileSize(){var e;return((e=this._file)==null?void 0:e.size)??0}get fileName(){var e;return((e=this._file)==null?void 0:e.name)??""}get fileType(){var r;const e=(r=this._file)==null?void 0:r.name;return((e==null?void 0:e.substring(e.lastIndexOf("."),e.length))||"").toLowerCase()}get filePath(){var e;return((e=this._file)==null?void 0:e.webkitRelativePath.split("/").filter(r=>r!==this.fileName).join("/"))??""}async _arrayBufferToHash(e){try{const r=await window.crypto.subtle.digest("SHA-256",e);return[...new Uint8Array(r)].map(a=>a.toString(16).padStart(2,"0").toUpperCase()).join("")}catch(r){throw console.error(r),new Error("calculate hash error")}}calcFileHash(){return new Promise((e,r)=>{if(!this._file)return r(new Error("file not exists"));const n=new FileReader;n.readAsArrayBuffer(this._file),n.onload=async a=>{var s;if(!((s=a.target)!=null&&s.result))return r(new Error("read file error"));const l=await this._arrayBufferToHash(a.target.result);if(!l)return Promise.reject(new Error("calculate hash error"));this._fileHash=l,e()}})}}const o=1*1024*1024;class g{constructor(e,r,n,a){this.body=e,this.partialHash=r,this.position=n,this.offset=a}}class S extends t{constructor(r,n=o){super(r);c(this,"_chunks",[]);this.chunkSize=n}get chunks(){return this._chunks}splitFile(r,n){return new Promise((a,l)=>{if(!this._file)return l(new Error("file not exists"));let s=r??0;const f=n??this.fileSize,u=new FileReader,_=()=>{if(s>=f){a();return}const h=this._file.slice(s,s+this.chunkSize);u.readAsArrayBuffer(h)};u.onload=async h=>{var p;if(!((p=h.target)!=null&&p.result))return l(new Error("read file error"));const w=h.target.result,y=await this._arrayBufferToHash(w);y&&this._chunks.push(new g(w,y,s,s+this.chunkSize>f?f-s:this.chunkSize)),s+=this.chunkSize,_()},u.addEventListener("error",()=>l(new Error("read file error"))),_()})}destroy(){this._file=void 0,this._chunks=[]}}i.FileSlicer=S,i.FileWithHash=t,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})});