Quellcode durchsuchen

add patented 3-step-file-type-determination procedure

Artur Paikin vor 7 Jahren
Ursprung
Commit
24816d2c5b
1 geänderte Dateien mit 29 neuen und 6 gelöschten Zeilen
  1. 29 6
      src/core/Utils.js

+ 29 - 6
src/core/Utils.js

@@ -176,23 +176,46 @@ function getArrayBuffer (file) {
 
 
 function getFileType (file) {
 function getFileType (file) {
   const emptyFileType = ['', '']
   const emptyFileType = ['', '']
-  if (file.type) {
-    return Promise.resolve(file.type.split('/'))
+  const extensionsToMime = {
+    'md': 'text/markdown',
+    'markdown': 'text/markdown',
+    'mp4': 'video/mp4',
+    'mp3': 'audio/mp3'
   }
   }
 
 
+  const fileExtension = getFileNameAndExtension(file.name)[1]
+
+  // 1. try to determine file type from magic bytes with file-type module
+  // this should be the most trustworthy way
   return getArrayBuffer(file)
   return getArrayBuffer(file)
     .then((buffer) => {
     .then((buffer) => {
       const type = fileType(buffer)
       const type = fileType(buffer)
       if (type && type.mime) {
       if (type && type.mime) {
         return type.mime.split('/')
         return type.mime.split('/')
       }
       }
-      return emptyFileType
+
+      // 2. if that’s no good, check if mime type is set in the file object
+      if (file.type) {
+        return Promise.resolve(file.type.split('/'))
+      }
+
+      // 3. if that’s no good, see if we can map extension to a mime type
+      if (extensionsToMime[fileExtension]) {
+        return Promise.resolve(extensionsToMime[fileExtension].split('/'))
+      }
+
+      // if all fails, well, return empty
+      return Promise.resolve(emptyFileType)
     })
     })
     .catch(() => {
     .catch(() => {
-      return emptyFileType
+      return Promise.resolve(emptyFileType)
     })
     })
-  // return mime.lookup(file.name)
-  // return file.type ? file.type.split('/') : ['', '']
+
+    // if (file.type) {
+    //   return Promise.resolve(file.type.split('/'))
+    // }
+    // return mime.lookup(file.name)
+    // return file.type ? file.type.split('/') : ['', '']
 }
 }
 
 
 // TODO Check which types are actually supported in browsers. Chrome likes webm
 // TODO Check which types are actually supported in browsers. Chrome likes webm