Rumah  >  Soal Jawab  >  teks badan

javascript - Apabila menggunakan fail input html pada telefon Android, jenis fail dan nama fail tidak boleh diperolehi

Pada sesetengah telefon Android, maklumat fail tidak boleh diperoleh melalui fail input. Apa yang sedang berlaku?

Nyahkod nama seperti berikut:

Ada pakar di luar negara yang boleh membaca dan mendapatkan aliran fail Adakah ini satu-satunya cara?
http://stackoverflow.com/ques...

迷茫迷茫2734 hari yang lalu480

membalas semua(1)saya akan balas

  • 黄舟

    黄舟2017-05-19 10:29:23

    Nampaknya masalah ini masih sukar untuk diselesaikan, jadi saya akan menyelesaikannya sendiri

    Memandangkan file.type dibaca terus ialah rentetan kosong, maklumat pengepala fail hanya boleh dibaca daripada strim fail.

    Rujuk skema pautan dalam soalan dan optimumkannya di sini

    function checkFileType(type, file, back) {
        /**
         * type png jpg mp4 ...
         * file input.change=> this.files[0]
         * back callback(boolean)
         */
        // http://www.garykessler.net/library/file_sigs.html
        var args = arguments;
        if (args.length != 3) {
            back(0);
        }
        var type = args[0]; // type = '(png|jpg)' , 'png'
        var file = args[1];
        var back = typeof args[2] == 'function' ? args[2] : function() {};
        if (file.type == '') {
            // 如果系统无法获取文件类型,则读取二进制流,对二进制进行解析文件类型
            var imgType = [
                'ff d8 ff', //jpg
                '89 50 4e', //png
    
                '0 0 0 14 66 74 79 70 69 73 6F 6D', //mp4
                '0 0 0 18 66 74 79 70 33 67 70 35', //mp4
                '0 0 0 0 66 74 79 70 33 67 70 35', //mp4
                '0 0 0 0 66 74 79 70 4D 53 4E 56', //mp4
                '0 0 0 0 66 74 79 70 69 73 6F 6D', //mp4
    
                '0 0 0 18 66 74 79 70 6D 70 34 32', //m4v
                '0 0 0 0 66 74 79 70 6D 70 34 32', //m4v
    
                '0 0 0 14 66 74 79 70 71 74 20 20', //mov
                '0 0 0 0 66 74 79 70 71 74 20 20', //mov
                '0 0 0 0 6D 6F 6F 76', //mov
    
                '4F 67 67 53 0 02', //ogg
                '1A 45 DF A3', //ogg
            ];
            var typeName = [
                'jpg',
                'png',
                'mp4',
                'mp4',
                'mp4',
                'mp4',
                'mp4',
                'm4v',
                'm4v',
                'mov',
                'mov',
                'mov',
                'ogg',
                'ogg',
            ];
            var sliceSize = /png|jpg|jpeg/.test(type) ? 3 : 12;
            var reader = new FileReader();
            reader.readAsArrayBuffer(file);
            reader.addEventListener("load", function(e) {
                var slice = e.target.result.slice(0, sliceSize);
                reader = null;
                if (slice && slice.byteLength == sliceSize) {
                    var view = new Uint8Array(slice);
                    var arr = [];
                    view.forEach(function(v) {
                        arr.push(v.toString(16));
                    });
                    view = null;
                    console.log(arr.join(' '));
                    var idx = arr.join(' ').indexOf(imgType);
                    if (idx > -1) {
                        back(typeName[idx]);
                        console.log(typeName[idx]);
                    } else {
                        back(false);
                    }
                } else {
                    back(false);
                }
    
            });
        } else {
            var type = file.name.match(/\.(\w+)$/)[1];
            back(type);
        }
    }

    Cara menggunakan:

    input.addEventListener(function(){
        var file = this.files[0];
        if(file.type==''){
            // 第一个参数支持单类型,或多类型,多类型时用竖线分隔,用于生成正则式
            checkFileType('(png|jpg|jpeg|mp4|mov|m4v|ogg)',file,function(fileType){
                console.log(fileType);
                //'png'
            });
            checkFileType('jpg',file,function(fileType){
                console.log(fileType);
                //false
            });
        }
    });

    Hanya membuat pertimbangan pada beberapa format biasa seperti png, jpg, jpeg, mp4, mov, m4v, ogg Untuk maklumat pengepala fail jenis fail lain, anda boleh melihatnya di sini:
    http://. www.garykessler .net/li...

    balas
    0
  • Batalbalas