获取'文件'的内容类型使用javascript的对象

时间:2015-05-14 07:50:44

标签: javascript jquery file object content-type

我有两个扩展名相同的文件如下:

1)test_audio_file.mp4(仅包含音频内容)

2)test_video_file.mp4(包括音频和视频内容)

上传文件后,我正在创建上传文件的File对象。

我想检查File对象的内容类型。即第一个文件为audio/mp4,第二个文件为video/mp4

当我使用file_object.type方法打印文件类型时,我在两种情况下都获得video/mp4

我的假设是第一个文件将获得audio/mp4而第二个文件将获得video/mp4

我在这里输入一行代码:

loadFile: function(file) {
   console.log(file.type);
};

是否有任何方法或方法可以获取第一个文件的内容类型audio和第二个文件的video

任何想法都会很棒。谢谢!

2 个答案:

答案 0 :(得分:1)

你可以尝试

input.file.type.match('video.*')

此处详细介绍https://stackoverflow.com/a/7412549/3327294

答案 1 :(得分:1)

浏览器通常会通过文件扩展名采用mime类型,在这两种情况下都是mp4。

可以肯定的是,您可以检查文件的二进制内容。

实施例

假设你已经在ArrayBuffer中加载了文件,你可以先为它创建一个灵活的视图(不能使用Uint32Array,因为缓冲区的长度必须是4字节对齐,但并非总是如此。文件,DataView将为您进行小端交换的小端:)

var view = new DataView(buffer);              // buffer = ArrayBuffer

更新:删除“不需要”首先检查/用于我建议在任何情况下使用的盒子大小。添加更多详细信息。)

然后,检查 atom MP4 file-format使用“atoms”和“boxes”进行操作,而不是像许多其他类似格式一样使用“chunk”)“ftyp “(0x66747970),以字节4-8(big-endian):

if (view.getUint32(4) === 0x66747970) {       // = "ftyp"
    // ok, so far so good..
}

现在检查这是什么类型的MP4:

if (view.getUint32(8) === 0x64617368) {       // = "dash"
    // audio
}
else if (view.getUint32(8) === 0x6D703432) {  // = "mp42"
    // audio + video
}

我们现在可以使用适当的mime类型集创建一个对象URL,用于音频:

var blob = new Blob([buffer], {type: "audio/mp4"});
var url = URL.createObjectURL(blob);  // src for video/audio element

注意您需要考虑许多其他类型(使用十六进制编辑器检查您期望的文件的实际值),您可能会想要使用带indexOf()的数组来检查多个可能的值:

var videoTypes = [0x6D703432, 0x69736F6D, ...];   // mp42, isom, ...
...
var type = view.getUint32(8);
if (videoTypes.indexOf(type) > -1) { /* ok! */ }

作为后备,你可以假设video/mp4表示未知的标题和类型,创建一个video/mp4作为mime-type的blob,让浏览器从那里处理文件。

另请参阅上面的链接,了解有关抵消和行长的详细信息。

工作演示

以下演示仅限于检查给定示例文件的类型。您当然需要扩展其他MP4类型(类型字段)来检查实际应用程序,例如使用一个音频类型阵列,一个用于视频等。

加载其中一个文件进行分析。

var inp = document.querySelector("input");
inp.onchange = function(e) {
  var reader = new FileReader();
  reader.onload = analyze;
  reader.readAsArrayBuffer(e.target.files[0]);
};

function analyze(e) {
  var buffer = e.target.result, view = new DataView(buffer), blob, url;
  
  // check file type
  if (view.getUint32(4) !== 0x66747970) {                    // = "ftyp"
    alert("Not MP4 file!"); return
  }

  // check if audio or audio+video
  if (view.getUint32(8) === 0x64617368) {                    // = "dash"
    alert("Audio\n(See console for example url)");
    blob = new Blob([buffer], {type: "audio/mp4"});
  }
  else if (view.getUint32(8) === 0x6D703432 ||               // = "mp42"
           view.getUint32(8) === 0x69736F6D) {               // = "isom"
    alert("Video+Audio\n(See console for example url)");
    blob = new Blob([buffer], {type: "video/mp4"});
  }
  else {                                                    // assume video/mp4
    alert("Unsupported:\n0x" + (view.getUint32(8)).toString(16));
    blob = new Blob([buffer], {type: "video/mp4"});
  }
  
  // convert blob to an URL that can be used with a video/audio element
  url = (URL || webkitURL).createObjectURL(blob);
  console.log("Copy and paste this into a tab, wo/quotes:", url);
}
Pick a MP4 file: <input type="file">