在HTML 5中,现在可以在客户端进行文件上传时的校验了,比如用户选择文件后,可以马上校验文件的大小和属性等,这其实时得益于浏览器端新增的对文件的校验能力,其中支持HTML 5的浏览器,都会实现W3C实现的文件API标准,其中可以读取客户端文件的各种信息和参数。 

下面的例子如下,首先是HTML 

<input type=\"file\" data-file_type=\"zip|png\" data-max_size=\"1000000\"> 

这里data-file_type属性中,指定了文件的类型,接受ZIP,PNG文件,用|分隔开来,其中data-max-size指定文件的大小,这里是1MB。然后使用jquery 进行判断 

$(\'input[type=file]\').each(function()  
{  
    if(typeof $(this).attr(\'data-file_type\') == \'string\')  
    {  
        var file_types = $(this).attr(\'data-file_type\').split(\'|\');  
    }  
        
    var mimes = get_mimes(file_types);  
  
         //文件要求的指定大小  
    var max_size = parseInt($(this).attr(\'data-max_size\'));  
  
    $(this).change(function(evt)  
    {  
        var finput = $(this);  
  
        var files = evt.target.files; // 获得文件对象  
  
                var output = [];  
  
        for (var i = 0, f; f = files[i]; i++)  
        {  
            //检查文件的类型是否符合指定要求  
            if(jQuery.inArray(f.type , mimes) == -1)  
            {  
                alert(\'File type \'+ f.type + \' not allowed\');  
                $(this).val(\'\');  
                continue;  
            }  
  
            //检查文件大小  
            else if(f.size > max_size)  
            {  
                alert(\'Maximum file size is \' + max_size + \' bytes.\');  
                $(this).val(\'\');  
            }  
  
            //Validation ok  
            else  
            {  
                output.push(\'[b]\', f.name, \'[/b] (\', f.type || \'n/a\', \') - \', f.size, \' bytes, last modified: \', f.lastModifiedDate.toLocaleDateString() );  
            }  
        }  
  
        finput.after(\'<div>\' + output.join(\'\') + \'</div>\');  
    });  
});  

在上面的代码中, var mimes = get_mimes(file_types); 其实是一个方法,如下: 

/* 
    Get the mimes of a list of extensions as an array 
*/  
function get_mimes(extensions)  
{  
    var mimes = [];  
    for(var i in extensions)  
    {  
        var ext = extensions[i];  
  
        if(ext in mime_types)  
        {  
            var mime = mime_types[ext];  
  
            if($.isArray(mime))  
            {  
                jQuery.merge(mimes , mime);  
            }  
            else  
            {  
                mimes.push(mime);  
            }  
        }  
    }  
  
    return mimes;  
}  

这里其实就是将ZIP,PNG这样的类型传入,然后返回一个这类文件对应的MIME/TYPE,比如定义一个 mime_types数组,如下:

var mime_types = {  
\"gif\":\"image\\/gif\", 
\"jpeg\":[\"image\\/jpeg\",\"image\\/pjpeg\"], 
\"jpg\":[\"image\\/jpeg\",\"image\\/pjpeg\"], 
\"jpe\":[\"image\\/jpeg\",\"image\\/pjpeg\"], 
\"png\":[\"image\\/png\",\"image\\/x-png\"], 
.................. 
} 

重点关注的是HTML 5中,新的文件API,可以在客户端马上判断文件类型,如下: 

var files = evt.target.files; // 获得文件对象,是一个集合,可以有多个文件 
var file_count = files.length;  //文件长度 

var file_1 = files[0]; // or files.item(0);这里获得多个文件中的第一个文件 

var name = file_1.name; //获得文件名 
var size = file_1.size;//获得文件大小 
var type = file_1.type; //文件类型 
var lastModifiedDate = file_1.lastModifiedDate;  //文件修改时间 

详细的关于HTML 5文件上传的,见: http://www.w3.org/TR/file-upload/

收藏 打印