Chrome for Android上的Html文件输入缺少扩展名和mime类型

Ken*_*Ito 6 javascript validation jquery android google-chrome

在html/js中,当您在Chrome(43)for Android(5.1.1)上选择文件时,生成的文件名缺少扩展名,文件类型为空字符串.想知道是否有办法获取遗失的信息?如果没有,是否有合理的方法对文件类型进行客户端验证?

请参阅下面的示例小提琴,并注意我在Windows桌面浏览器和ios safari上获得扩展和mime类型.

http://jsfiddle.net/Lfg3xhy4/

$(function(){
    $("#fileInput").on("change", function(e){
        $("#name").html(e.target.files[0].name);
        $("#type").html(e.target.files[0].type);
    });
});
Run Code Online (Sandbox Code Playgroud)

更新 我注意到在使用android Documents浏览器时,Audio选项卡(我用来选择文件)似乎不提供文件扩展名和mime类型.如果我使用任何其他选项卡导航到文件,一切似乎都可以.

Ken*_*Ito 3

通过 Android 文档文件浏览器,某些选项卡不提供文件扩展名和类型。例如,“音频”选项卡(显示音频元数据)和一些连接的存储帐户。

因此,进行文件类型验证的另一种方法是使用“文件签名” http://www.filesignatures.net/index.php?page=all

本质上,您查看了二进制文件的一部分。下面的简化示例。

var audioFile;  //Set from elsewhere
if (FileReader) {
    var reader = new FileReader();
    reader.addEventListener("load", function(e) {
        var mp3FileSignature = [255, 251, 48];
        var id3FileSignature = [73, 68, 51];
        //There are actually quite a few more scenarios to handle for mp3's in particular
        //Most file types are simpler

        var arrayBuffer = e.target.result;

        if (arrayBuffer && arrayBuffer.byteLength >= 3) {
            var slice = arrayBuffer.slice(0, 3);
            var view = new Uint8Array(slice);
            if ((mp3FileSignature[0] != view[0] || mp3FileSignature[1] != view[1] || mp3FileSignature[2] != view[2])  
                && (id3FileSignature[0] != view[0] || id3FileSignature[1] != view[1] || id3FileSignature[2] != view[2])) {

                //Not an mp3
            }
        }

    })
    reader.readAsArrayBuffer(audioFile);
}
Run Code Online (Sandbox Code Playgroud)