html5表单上传控件Files API
表单上传控件: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 为上传文件的最后修改时间
通过上面的几个对象,我们能够控制用户上传的文件大小和文件类型,以便减轻服务器再次检测时的压力,并提升安全系数。
[javascript]
VAR a=document.getElementById("file");
a.onchange=function(e){
SPAN style="WHITE-sPACE: pre">
/SPAN>
e=e || window.event;
SPAN style="WHITE-SPACE: pre">
/SPAN>
var b=e.target.files;
SPAN style="WHITE-SPACE: pre">
/SPAN>
alert(b[0].name);
}
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
[html]
!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">
p id="DropZone">
/p>
p id="Lists">
/p>
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>
!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">
p id="DropZone">
/p>
p id="Lists">
/p>
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就可以被用来追踪进度。
上传图片预览:
[html]
!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">
p id="Preview">
/p>
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>
!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">
p id="Preview">
/p>
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文件内容预览(需对>
&
'"|等符号进行过滤否则会中断读取):
[html]
!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">
p id="Preview">
/p>
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 p = document.createElement('p');
p.classname = "text"
p.innerHTML = encodeHTML(this.result);
p.insertBefore(p, 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>
!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">
p id="Preview">
/p>
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 p = document.createElement('p');
p.className = "text"
p.innerHTML = encodeHTML(this.result);
p.insertBefore(p, 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指定区域文本内容:
[html]
!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>
p id="range">
/p>
p id="content">
/p>
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>
!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>
p id="range">
/p>
p id="content">
/p>
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、文件读取进度
[html]
!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>
!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>
表单上传控件: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 为上传文件的最后修改时间
通过上面的几个对象,我们能够控制用户上传的文件大小和文件类型,以便减轻服务器再次检测时的压力,并提升安全系数。
[javascript]
var a=document.getElementById("file");
a.onchange=function(e){
SPAN style="WHITE-SPACE: pre">
/SPAN>
e=e || window.event;
SPAN style="WHITE-SPACE: pre">
/SPAN>
var b=e.target.files;
SPAN style="WHITE-SPACE: pre">
/SPAN>
alert(b[0].name);
}
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
[html]
!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">
p id="DropZone">
/p>
p id="Lists">
/p>
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>
!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">
p id="DropZone">
/p>
p id="Lists">
/p>
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就可以被用来追踪进度。
上传图片预览:
[html]
!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">
p id="Preview">
/p>
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>
!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">
p id="Preview">
/p>
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文件内容预览(需对>
&
'"|等符号进行过滤否则会中断读取):
[html]
!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">
p id="Preview">
/p>
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 p = document.createElement('p');
p.className = "text"
p.innerHTML = encodeHTML(this.result);
p.insertBefore(p, 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>
!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">
p id="Preview">
/p>
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 p = document.createElement('p');
p.className = "text"
p.innerHTML = encodeHTML(this.result);
p.insertBefore(p, 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指定区域文本内容:
[html]
!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>
p id="range">
/p>
p id="content">
/p>
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>
!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>
p id="range">
/p>
p id="content">
/p>
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、文件读取进度
[html]
!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>
!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>
觉得可用,就经常来吧! 欢迎评论哦! html5教程,巧夺天工,精雕玉琢。小宝典献丑了!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: html5表单上传控件Files API
本文地址: https://pptw.com/jishu/586716.html