fileOprs.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. export default class FileOpr {
  2. _file: File | any = null;
  3. _defaultChunkSize: number = 1024 * 1024;
  4. _minChunkSize: number = 0;
  5. _partsNumber: number = 0;
  6. constructor (file: File) {
  7. this._file = file;
  8. if (Math.ceil(file.size / this._defaultChunkSize) <= 1) {
  9. this._minChunkSize = 500 * 1024;
  10. this._partsNumber = Math.ceil(file.size / this._minChunkSize);
  11. } else if (Math.ceil(file.size / this._defaultChunkSize) < 10000) {
  12. this._partsNumber = Math.ceil(file.size / this._defaultChunkSize);
  13. } else {
  14. this._partsNumber = 10000;
  15. this._minChunkSize = Math.ceil(this._file.size / 10000);
  16. }
  17. }
  18. _fileSlice (sliceIndex: number) {
  19. const partSize = this._minChunkSize === 0 ? this._defaultChunkSize : this._minChunkSize,
  20. _start = sliceIndex * partSize,
  21. _end = _start + partSize > this._file.size ? this._file.size : _start + partSize;
  22. const partBlob = this._file.slice(_start, _end);
  23. return {
  24. file: partBlob as Blob,
  25. partNumber: sliceIndex + 1,
  26. partSize: (partBlob as Blob).size
  27. };
  28. }
  29. getSliceArr (startPartNumber: number, num: number) {
  30. const sliceArr: any[] = [];
  31. while (sliceArr.length < num) {
  32. sliceArr.push(this._fileSlice(startPartNumber + sliceArr.length - 1));
  33. }
  34. return sliceArr;
  35. }
  36. getPartsNumber () {
  37. return this._partsNumber;
  38. }
  39. }