diff --git a/package-lock.json b/package-lock.json index b6550db8eb..740fca1eb1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3750,6 +3750,14 @@ "window": "4.2.6" } }, + "browser-md5-file": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browser-md5-file/-/browser-md5-file-1.1.1.tgz", + "integrity": "sha512-9h2UViTtZPhBa7oHvp5mb7MvJaX5OKEPUsplDwJ800OIV+In7BOR3RXOMB78obn2iQVIiS3WkVLhG7Zu1EMwbw==", + "requires": { + "spark-md5": "^2.0.2" + } + }, "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", @@ -7074,7 +7082,8 @@ }, "ansi-regex": { "version": "4.1.0", - "resolved": "", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "astral-regex": { @@ -12901,6 +12910,11 @@ "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, + "spark-md5": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-2.0.2.tgz", + "integrity": "sha1-N7djhHdjrn56zvLKUjPQHmSaeLc=" + }, "sparkles": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", diff --git a/package.json b/package.json index 7959e9cb0e..ace8d2edcf 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,7 @@ "@formio/vanilla-text-mask": "^5.1.1", "autocompleter": "^6.1.2", "browser-cookies": "^1.2.0", + "browser-md5-file": "^1.1.1", "compare-versions": "^4.1.3", "core-js": "^3.21.1", "custom-event-polyfill": "^1.0.7", diff --git a/src/components/file/File.js b/src/components/file/File.js index b0e62057a6..d6f11e47c2 100644 --- a/src/components/file/File.js +++ b/src/components/file/File.js @@ -4,6 +4,7 @@ import download from 'downloadjs'; import _ from 'lodash'; import NativePromise from 'native-promise-only'; import fileProcessor from '../../providers/processor/fileProcessor'; +import BMF from 'browser-md5-file'; let Camera; let webViewCamera = navigator.camera || Camera; @@ -612,6 +613,15 @@ export default class FileComponent extends Field { // files is not really an array and does not have a forEach method, so fake it. /* eslint-disable max-statements */ Array.prototype.forEach.call(files, async(file) => { + const bmf = new BMF(); + const hash = await new Promise((resolve, reject) => { + bmf.md5(file, (err, md5)=>{ + if (err) { + return reject(err); + } + return resolve(md5); + }); + }); const fileName = uniqueName(file.name, this.component.fileNameTemplate, this.evalContext()); const fileUpload = { originalName: file.name, @@ -619,6 +629,7 @@ export default class FileComponent extends Field { size: file.size, status: 'info', message: this.t('Processing file. Please wait...'), + hash }; // Check if file with the same name is being uploaded @@ -756,6 +767,7 @@ export default class FileComponent extends Field { this.statuses.splice(index, 1); } fileInfo.originalName = file.name; + fileInfo.hash = fileUpload.hash; if (!this.hasValue()) { this.dataValue = []; }