diff --git a/CHANGELOG.md b/CHANGELOG.md index c076d705..54725bd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +### Changed + +- Setting of `contentType` to use detection when content type is not provided + ## [16.0.0] - 2024-09-25 ### Added diff --git a/package-lock.json b/package-lock.json index 6df0c89b..2159e5e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@sentry/tracing": "^7.77.0", "date-fns": "^2.30.0", "file-saver": "^2.0.5", + "file-type-checker": "^1.1.2", "jwt-decode": "^4.0.0", "localforage": "^1.10.0", "lodash.clonedeep": "^4.5.0", @@ -7226,6 +7227,11 @@ "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" }, + "node_modules/file-type-checker": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/file-type-checker/-/file-type-checker-1.1.2.tgz", + "integrity": "sha512-HodBNiinBQNHQfXhXzAuHkU2udHF3LFS6PAOEZqxW+BjotZVCaMR7ckpTTnvLi718dbzRavnjRX0kbSb5pJG3g==" + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -18390,6 +18396,11 @@ "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" }, + "file-type-checker": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/file-type-checker/-/file-type-checker-1.1.2.tgz", + "integrity": "sha512-HodBNiinBQNHQfXhXzAuHkU2udHF3LFS6PAOEZqxW+BjotZVCaMR7ckpTTnvLi718dbzRavnjRX0kbSb5pJG3g==" + }, "fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", diff --git a/package.json b/package.json index f46bb3f9..1ce03fe5 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@sentry/tracing": "^7.77.0", "date-fns": "^2.30.0", "file-saver": "^2.0.5", + "file-type-checker": "^1.1.2", "jwt-decode": "^4.0.0", "localforage": "^1.10.0", "lodash.clonedeep": "^4.5.0", diff --git a/src/approvals-service.ts b/src/approvals-service.ts index 1e906db7..5cbd7207 100644 --- a/src/approvals-service.ts +++ b/src/approvals-service.ts @@ -17,7 +17,9 @@ export type FormSubmissionApprovalsResponse = { formSubmissionApproval: ApprovalTypes.FormSubmissionApproval formApprovalFlowInstance: ApprovalTypes.FormApprovalFlowInstance formSubmissionMeta: SubmissionTypes.FormSubmissionMeta - latestSuccessfulFormSubmissionPayment: SubmissionTypes.FormSubmissionPayment | undefined + latestSuccessfulFormSubmissionPayment: + | SubmissionTypes.FormSubmissionPayment + | undefined }> } diff --git a/src/services/uploadAttachment.ts b/src/services/uploadAttachment.ts index 81e64b62..c1f06d6e 100644 --- a/src/services/uploadAttachment.ts +++ b/src/services/uploadAttachment.ts @@ -1,6 +1,7 @@ import { SubmissionTypes } from '@oneblink/types' import { ProgressListener } from '../types/submissions' import generateOneBlinkUploader from './generateOneBlinkUploader' +import fileTypeChecker from 'file-type-checker' export type UploadAttachmentConfiguration = { fileName: string @@ -64,8 +65,15 @@ export default async function uploadAttachment( abortSignal?: AbortSignal, ): Promise { const oneblinkUploader = generateOneBlinkUploader() - // S3 defaults unknown file types to the following, do the same here for our submission model - const _contentType = contentType || 'application/octet-stream' + + let _contentType = contentType || 'application/octet-stream' // S3 default for unknown content type + if (!contentType) { + const buffer = await data.arrayBuffer() + const detectedType = fileTypeChecker.detectFile(buffer) + if (detectedType) { + _contentType = detectedType.mimeType + } + } const result = await oneblinkUploader.uploadAttachment({ formId, fileName,