文件上传:<input type="file" /> (IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持。)

1、允许上传文件数量

允许选择多个文件:

<input type="file" multiple>

只允许上传一个文件:

<input  type="file" single>

2、上传指定的文件格式

<input type="file" accept="image/gif,image/png" />

这里的上传格式仅指打开上传弹窗选择文件时默认的文件格式,可手动修改成其它文件格式。

如果不限制上传图片的格式可写成:accept="image/*"

其它格式参考如下:

*.3gpp   audio/3gpp, video/3gpp    3GPP Audio/Video
*.ac3    audio/ac3    AC3 Audio
*.asf    allpication/vnd.ms-asf    Advanced Streaming Format
*.au     audio/basic    AU Audio
*.css    text/css    Cascading Style Sheets
*.csv    text/csv    Comma Separated Values
*.doc    application/msword    MS Word Document
*.dot    application/msword    MS Word Template
*.dtd    application/xml-dtd    Document Type Definition
*.dwg    image/vnd.dwg    AutoCAD Drawing Database
*.dxf    image/vnd.dxf    AutoCAD Drawing Interchange Format
*.gif    image/gif    Graphic Interchange Format
*.htm    text/html    HyperText Markup Language
*.html   text/html    HyperText Markup Language
*.jp2    image/jp2    JPEG-2000
*.jpe    image/jpeg    JPEG
*.jpeg   image/jpeg    JPEG
*.jpg    image/jpeg    JPEG
*.js     text/javascript, application/javascript    JavaScript
*.json   application/json    JavaScript Object Notation
*.mp2    audio/mpeg, video/mpeg    MPEG Audio/Video Stream, Layer II
*.mp3    audio/mpeg    MPEG Audio Stream, Layer III
*.mp4    audio/mp4, video/mp4    MPEG-4 Audio/Video
*.mpeg   video/mpeg    MPEG Video Stream, Layer II
*.mpg    video/mpeg    MPEG Video Stream, Layer II
*.mpp    application/vnd.ms-project    MS Project Project
*.ogg    application/ogg, audio/ogg    Ogg Vorbis
*.pdf    application/pdf    Portable Document Format
*.png    image/png    Portable Network Graphics
*.pot    application/vnd.ms-powerpoint    MS PowerPoint Template
*.pps    application/vnd.ms-powerpoint    MS PowerPoint Slideshow
*.ppt    application/vnd.ms-powerpoint    MS PowerPoint Presentation
*.rtf    application/rtf, text/rtf    Rich Text Format
*.svf    image/vnd.svf    Simple Vector Format
*.tif    image/tiff    Tagged Image Format File
*.tiff   image/tiff    Tagged Image Format File
*.txt    text/plain    Plain Text
*.wdb    application/vnd.ms-works    MS Works Database
*.wps    application/vnd.ms-works    Works Text Document
*.xhtml  application/xhtml xml    Extensible HyperText Markup Language
*.xlc    application/vnd.ms-excel    MS Excel Chart
*.xlm    application/vnd.ms-excel    MS Excel Macro
*.xls    application/vnd.ms-excel    MS Excel Spreadsheet
*.xlt    application/vnd.ms-excel    MS Excel Template
*.xlw    application/vnd.ms-excel    MS Excel Workspace
*.xml    text/xml, application/xml    Extensible Markup Language
*.zip    aplication/zip    Compressed Archive

3、FileList上传文件数组

FileList对象都是一组文件对象的集合,而文件对象则拥有下列的属性:
name – 文件名(不包含路径)
type – 文件的MIME类型(小写)
size – 文件的尺寸(单位为字节)

lastModifiedDate 为上传文件的最后修改时间

通过上面的几个对象,我们能够控制用户上传的文件大小和文件类型,以便减轻服务器再次检测时的压力,并提升安全系数

var a=document.getElementById("file");
a.onchange=function(e){
    e=e || window.event;
    var b=e.target.files;
    alert(b[0].name);
}

4、拖动上传

dataTransfer 对象

dropEffect[=sCursorStyle]

设置或获取拖拽操作的类型和要显示的光标类型

  • copy:复制样式被显示
  • link:链接样式被显示
  • move:移动样式被显示
  • none:默认,没有鼠标样式被定义

effectAllowed[=sEffect]
设置或获取数据传送操作可应用与该对象的源元素

  • copy 选项被复制
  • link 选项被dataTransfer作为link方式保存
  • move 当放置时,对象被移动至目标对象
  • copylink 选项是被复制还是被作为link方式保存关键在于目标对象
  • linkmove 选项是被作为link方式保存还是被移动关键在于目标对象
  • all 所有效果都被支持
  • none 不支持任何效果
  • uninitialized 默认不能通过这个属性传递任何值

setData(sFormat,sData) 将指定格式的数据赋值给dataTransfer或者clipboardData sFormat:URL,Text
getData(sFormat) 从dataTransfer或者clipboardData中获取值 sFormat:URL,Text
clearData([sFormat]) 通过dataTransfer或者clipboardData中删除某种格式的数据 sFormat:Text,URL,File,HTML,Image

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
#DropZone{border:1px solid #CCC;height:50px;}
</style>
</head>
<body>
<input type="file" multiple accept="image/gif,image/png" id="file">
<div id="DropZone"></div>
<div id="Lists"></div>
<script>
var aa=document.getElementById("file");
aa.onchange=function(){
    fileDrop();
}
  
function fileDrop(e) {
    e = e || window.event;
      
    e.stopPropagation(); // 阻止冒泡
    e.preventDefault();  //阻止默认行为
      
    var files = e.dataTransfer.files;   //FileList
      
    var output = [];
      
    for(var i = 0, f; f = files[i]; i  ) {
        output.push('<li><strong>'   f.name   '</strong>('   f.type   ') - '   f.size  ' bytes</li>');
    }
      
    document.getElementById('Lists').innerHTML = '<ul>'   output.join('')   '</ul>';
};
  
function dragOver(e) {
    e = e || window.event;
      
    e.stopPropagation();
    e.preventDefault();
    e.dataTransfer.dropEffect = 'copy'; //指定拖放视觉效果
};
var d = document.getElementById('DropZone');
  
try {
    d.addEventListener('dragover', dragOver, false);
    d.addEventListener('drop', fileDrop, false)
} catch(ex) {
    document.write('something must be wrong!');
}
  
</script>
</body>
</html>

5、FileReader文件预览,读取文件数据(同时可读取图片文件宽高)

FileReader包含四种异步读取文件的方式:

  • FileReader.readAsBinaryString(Blob|File) - result属性包含的是file/blob的二进制字符串形式的数据。每个字节由一个0-255的整数表示。
  • FileReader.readAsText(Blob|File, opt_encoding) - result属性包含的是以文本方式表示的file/blob数据。默认情况下,字符串以'UTF-8'编码方式解码。使用opt_encoding参数可以指定一个不同的格式。
  • FileReader.readAsDataURL(Blob|File) - result属性包含的是以data URL编码的file/blob数据。
  • FileReader.readAsArrayBuffer(Blob|File) - result属性包含的是以ArrayBuffer对象表示的file/blob数据。

一旦这些read方法被调用,onloadstart, onprogress, onload, onabort, onerror, onloadend就可以被用来追踪进度。

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
body{margin:0;padding:0;}
img{vertical-align:bottom;}
</style>
</head>
<body>
<input type="file" multiple accept="image/gif,image/png,,image/jpeg" id="Files">
<div id="Preview"></div>
<ul id="Errors"></ul>
<script>
function fileSelect(e) {
    e = e || window.event;
      
    var files = e.target.files;  //FileList Objects   
    var ireg = /image\/.*/i,
        p = document.getElementById('Preview');
          
    var ul = document.getElementById('Errors');
    for(var i = 0, f; f = files[i]; i  ) {
        if(!f.type.match(ireg)) {
            //设置错误信息
            var li = document.createElement('li');
            li.innerHTML = '<li>'   f.name  '不是图片文件.</li>';
              
            ul.appendChild(li);
              
            continue;
        }
          
        var reader = new FileReader();
          
        reader.onload = (function(file) {
            return function(e) {
                var span = document.createElement('span');
                var img = new Image;
                img.alt=file.name;
                img.onload = function() {
                    console.log(img.height); // image is loaded; sizes are available
                };
  
                img.src=this.result;
                span.innerHTML = '<img class="thumb" src="'  this.result  '" alt="'  file.name  '" />';
                  
                p.insertBefore(span, null);
            };
        })(f);
        //读取文件内容
        reader.readAsDataURL(f);
    }
}
      
if(window.File && window.FileList && window.FileReader && window.Blob) {
    document.getElementById('Files').addEventListener('change', fileSelect, false);
} else {
    document.write('您的浏览器不支持File Api');
}
</script>
</body>
</html>

上传txt文件内容预览(需对<>&'"|等符号进行过滤否则会中断读取):

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
body{margin:0;padding:0;}
img{vertical-align:bottom;}
</style>
</head>
<body>
<input type="file" multiple id="Files">
<div id="Preview"></div>
<ul id="Errors"></ul>
<script>
function encodeHTML(source) { 
    //return source;
    return source 
            .replace(/&/g, '&') 
            .replace(/</g, '<') 
            .replace(/>/g, '>')
            .replace(/\"/g, '"');
}; 
function fileSelect(e) { 
    e = e || window.event; 
        
    var files = e.target.files;  //FileList Objects     
    var ireg = /text\/.*/i, 
        p = document.getElementById('Preview'); 
            
    var ul = document.getElementById('Errors'); 
    for(var i = 0, f; f = files[i]; i  ) { 
        console.log(f.type); 
        if(!f.type.match(ireg)) { 
            //设置错误信息 
            var li = document.createElement('li'); 
            li.innerHTML = '<li>'   f.name  '不是文本文件.</li>'; 
                
            ul.appendChild(li); 
                
            continue; 
        } 
            
        var reader = new FileReader(); 
            
        reader.onload = (function(file) { 
            return function(e) { 
                var div = document.createElement('div'); 
                div.className = "text" 
                div.innerHTML = encodeHTML(this.result); 
                    
                p.insertBefore(div, null); 
            }; 
        })(f); 
        //读取文件内容 
        reader.readAsText(f); 
    } 
} 
        
if(window.File && window.FileList && window.FileReader && window.Blob) { 
    document.getElementById('Files').addEventListener('change', fileSelect, false); 
} else { 
    document.write('您的浏览器不支持File Api'); 
} 
</script>
</body>
</html>

读取上传txt指定区域文本内容:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
body{margin:0;padding:0;}
img{vertical-align:bottom;}
</style>
</head>
<body>
<input type="file" multiple id="Files">
<button type="button" id="buttons" data-start="0" data-end="3">确定</button>
<div id="range"></div>
<div id="content"></div>
<script>
  
function readBlob(start, end) { 
    var files = document.getElementById('Files').files; 
        
    if(!files.length) { 
        alert('请选择文件'); 
        return false; 
    } 
        
    var file = files[0], 
        start = parseInt(start, 10) || 0, 
        end = parseInt(end, 10) || (file.size - 1); 
            
    var r = document.getElementById('range'), 
        c = document.getElementById('content'); 
            
    var reader = new FileReader(); 
  
    reader.onloadend = function(e) { 
        if(this.readyState == FileReader.DONE) { 
            c.textContent = this.result; 
            r.textContent = "Read bytes: "   (start   1)   " - "   (end   1)   " of "   file.size   " bytes"; 
        } 
    }; 
  
    var blob; 
         
    blob = file.slice(start, end   1, 'text/plain;charset=UTF-8'); 
    reader.readAsBinaryString(blob); 
}; 
    
try { 
    document.getElementById('buttons').addEventListener('click', function(e) { 
        if(e.target.tagName.toLowerCase() == 'button') { 
            var start = e.target.getAttribute('data-start'), 
                end = e.target.getAttribute('data-end'); 
                    
            readBlob(start, end); 
        }   
    }); 
} catch(ex) { 
    alert('something error happens!') 
} 
</script>
</body>
</html>

File接口提供了slice方法支持把文件切成不同的片段,第一个参数是起始的字节数,第二个参数是结束的字节数,还有一个可选的内容类型字符串可以作为第三个参数。早期的chrome和firefox版本不支持file.slice 可使用file.webkitSlice和file.mozSlice替代,最新版本均支持file.slice。

6、文件读取进度

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form> 
    <fieldset> 
        <legend>分度读取文件:</legend> 
        <input type="file" id="File" /> 
        <input type="button" value="中断" id="Abort" /> 
        <p> 
            <label>读取进度:</label><progress id="Progress" value="0" max="100"></progress> 
        </p> 
        <p id="Status"></p> 
    </fieldset> 
</form> 
  
<script>
var h = { 
    init: function() { 
        var me = this; 
            
        document.getElementById('File').onchange = me.fileHandler; 
        document.getElementById('Abort').onclick = me.abortHandler; 
            
        me.status = document.getElementById('Status'); 
        me.progress = document.getElementById('Progress'); 
        me.percent = document.getElementById('Percent'); 
            
        me.loaded = 0; 
        //每次读取1M 
        me.step = 1024 * 1024; 
        me.times = 0; 
    }, 
    fileHandler: function(e) { 
        var me = h; 
            
        var file = me.file = this.files[0]; 
        var reader = me.reader = new FileReader(); 
            
        // 
        me.total = file.size; 
            
        reader.onloadstart = me.onLoadStart; 
        reader.onprogress = me.onProgress; 
        reader.onabort = me.onAbort; 
        reader.onerror = me.onerror; 
        reader.onload = me.onLoad; 
        reader.onloadend = me.onLoadEnd; 
        //读取第一块 
        me.readBlob(file, 0);
    }, 
    onLoadStart: function() { 
        var me = h; 
    }, 
    onProgress: function(e) { 
        var me = h; 
            
        me.loaded  = e.loaded; 
        //更新进度条 
        me.progress.value = (me.loaded / me.total) * 100; 
    }, 
    onAbort: function() { 
        var me = h; 
    }, 
    onError: function() { 
        var me = h; 
            
    }, 
    onLoad: function() { 
        var me = h; 
    
        if(me.loaded < me.total) { 
            me.readBlob(me.loaded); 
        } else { 
            me.loaded = me.total; 
        } 
    }, 
    onLoadEnd: function() { 
        var me = h; 
            
    }, 
    readBlob: function(start) { 
        var me = h; 
            
        var blob, 
            file = me.file; 
            
        me.times  = 1; 
            
        if(file.slice) { 
            blob = file.slice(start, start   me.step   1); 
        } else if(file.mozSlice) { 
            blob = file.mozSlice(start, start   me.step   1); 
        } 
            
        me.reader.readAsText(blob); 
    }, 
    abortHandler: function() { 
        var me = h; 
            
        if(me.reader) { 
            me.reader.abort(); 
        } 
    } 
}; 
    
h.init(); 
</script>
</body>
</html>

本文代码以chrome测试为主。

到此这篇关于JavaScript文件上传问题整理的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持Devmax。

JavaScript文件上传的常见问题整理的更多相关文章

  1. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. html5简介_动力节点Java学院整理

    这篇文章主要介绍了html5简介,用于指定构建网页的元素,这些元素中的大多数都用于描述网页内容,有兴趣的可以了解一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. ios 8 Homescreen webapp,关闭和打开iPad停止javascript

    我有一个适用于iPad的全屏HTML5网络应用程序,并且刚刚安装了IOS8来试用它,它一切正常,直到你关闭并重新启动iPad.一旦web应用程序重新启动javascript就会停止并加载新页面不会重新启动它.在iPad上的Safari中打开同一页面时,关闭和打开iPad会继续按预期工作.其他人注意到了这个或想出了一个解决方案吗?解决方法这似乎是我在iOS8.1.1更新中解决的.

  7. iOS 6 javascript与object.defineProperty的间歇性问题

    当访问使用较新的Object.defineProperty语法定义属性的对象的属性时,有没有其他人注意到新iOS6javascript引擎中的间歇性错误/问题?https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty我正在看到javascript失败的情况,说

  8. ios – 如何使用JSExport导出内部类的方法

    解决方法似乎没有办法将内部类函数导出到javascript.我将内部类移出并创建了独立的类,它起作用了.

  9. 静音iOS推送通知与React Native应用程序在后台

    我有一个ReactNative应用程序,我试图获得一个发送到JavaScript处理程序的静默iOS推送通知.我看到的行为是AppDelegate中的didReceiveRemoteNotification函数被调用,但是我的JavaScript中的处理程序不会被调用,除非应用程序在前台,或者最近才被关闭.我很困惑的事情显然是应用程序正在被唤醒,并且它的didReceiveRemoteNotifi

  10. ios – 内存泄漏与UIWebView和Javascript

    清楚地包含一个Javascript文件到我的HTML是使UIWebView泄漏内存.当我重复使用相同的UIWebView对象时,或者每当我有内容实例化一个新的漏洞时,会出现泄漏的事实,导致我认为必须有一些JavaScript文件被loadHTMLString处理,导致泄漏.有人知道如何解决这个问题吗?

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部