UNPKG

file-fragment-upload

Version:

文件分片上传 获取文件hash值 文件分片

104 lines (84 loc) 2.95 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var React = require('react'); var reactDropzone = require('react-dropzone'); var SparkMD5 = _interopDefault(require('spark-md5')); /** * 获取文件的hash值,即md5值 * @param file 要分割的文件对象 * @param chunkSize 分片大小,默认每片大小为为3M * @returns */ var getFileHash = function getFileHash(file, chunkSize) { if (chunkSize === void 0) { chunkSize = 3 * 1024 * 1024; } var blobSlice = File.prototype.slice; return new Promise(function (resolve, reject) { var chunks = Math.ceil(file.size / chunkSize); var currentChunk = 0; var spark = new SparkMD5.ArrayBuffer(); var fileReader = new FileReader(); function loadNext() { var start = currentChunk * chunkSize; var end = start + chunkSize >= file.size ? file.size : start + chunkSize; fileReader.readAsArrayBuffer(blobSlice.call(file, start, end)); } fileReader.onload = function (e) { if (e.target && e.target.result) { spark.append(e.target.result); // Append array buffer currentChunk += 1; if (currentChunk < chunks) { loadNext(); } else { var result = spark.end(); // 如果单纯的使用result 作为hash值的时候, 如果文件内容相同,而名称不同的时候 // 想保留两个文件无法保留。所以把文件名称加上。 var sparkMd5 = new SparkMD5(); sparkMd5.append(result); sparkMd5.append(file.name); var hexHash = sparkMd5.end(); resolve(hexHash); } } }; fileReader.onerror = function (err) { reject(err); }; loadNext(); })["catch"](function (err) { console.error(err); }); }; /** * * @param startByte 分片起始位置 * @param endByte 分片结束位置 * @returns */ var getChunk = function getChunk(file, startByte, endByte) { // @ts-ignore var blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice; var chunk = blobSlice.call(file, startByte, endByte); return chunk; }; var App = function App(props) { var onDrop = React.useCallback(function (files) { props.uploadFiles(files); }, []); var _useDropzone = reactDropzone.useDropzone({ onDrop: onDrop }), getRootProps = _useDropzone.getRootProps, getInputProps = _useDropzone.getInputProps; return React.createElement("div", Object.assign({}, getRootProps()), React.createElement("input", Object.assign({ type: "file", style: { display: 'none' } }, getInputProps())), props.children); }; exports.default = App; exports.getChunk = getChunk; exports.getFileHash = getFileHash; //# sourceMappingURL=file-fragment-upload.cjs.development.js.map