JavaScript文件上傳的常見問題整理
文件上傳:<input type="file" /> (IE9及以下不支持下面這些功能,其它瀏覽器最新版本均已支持。)
1、允許上傳文件數(shù)量
允許選擇多個(gè)文件:
<input type="file" multiple>
只允許上傳一個(gè)文件:
<input ?type="file" single>
2、上傳指定的文件格式
<input type="file" accept="image/gif,image/png" />
這里的上傳格式僅指打開上傳彈窗選擇文件時(shí)默認(rèn)的文件格式,可手動修改成其它文件格式。
如果不限制上傳圖片的格式可寫成: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上傳文件數(shù)組
FileList對象都是一組文件對象的集合,而文件對象則擁有下列的屬性:
name – 文件名(不包含路徑)
type – 文件的MIME類型(小寫)
size – 文件的尺寸(單位為字節(jié))
lastModifiedDate 為上傳文件的最后修改時(shí)間
通過上面的幾個(gè)對象,我們能夠控制用戶上傳的文件大小和文件類型,以便減輕服務(wù)器再次檢測時(shí)的壓力,并提升安全系數(shù)
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]
設(shè)置或獲取拖拽操作的類型和要顯示的光標(biāo)類型
- copy:復(fù)制樣式被顯示
- link:鏈接樣式被顯示
- move:移動樣式被顯示
- none:默認(rèn),沒有鼠標(biāo)樣式被定義
effectAllowed[=sEffect]
設(shè)置或獲取數(shù)據(jù)傳送操作可應(yīng)用與該對象的源元素
- copy 選項(xiàng)被復(fù)制
- link 選項(xiàng)被dataTransfer作為link方式保存
- move 當(dāng)放置時(shí),對象被移動至目標(biāo)對象
- copylink 選項(xiàng)是被復(fù)制還是被作為link方式保存關(guān)鍵在于目標(biāo)對象
- linkmove 選項(xiàng)是被作為link方式保存還是被移動關(guān)鍵在于目標(biāo)對象
- all 所有效果都被支持
- none 不支持任何效果
- uninitialized 默認(rèn)不能通過這個(gè)屬性傳遞任何值
setData(sFormat,sData) 將指定格式的數(shù)據(jù)賦值給dataTransfer或者clipboardData sFormat:URL,TextgetData(sFormat) 從dataTransfer或者clipboardData中獲取值 sFormat:URL,TextclearData([sFormat]) 通過dataTransfer或者clipboardData中刪除某種格式的數(shù)據(jù) 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(); //阻止默認(rèn)行為
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文件預(yù)覽,讀取文件數(shù)據(jù)(同時(shí)可讀取圖片文件寬高)
FileReader包含四種異步讀取文件的方式:
- FileReader.readAsBinaryString(Blob|File) - result屬性包含的是file/blob的二進(jìn)制字符串形式的數(shù)據(jù)。每個(gè)字節(jié)由一個(gè)0-255的整數(shù)表示。
- FileReader.readAsText(Blob|File, opt_encoding) - result屬性包含的是以文本方式表示的file/blob數(shù)據(jù)。默認(rèn)情況下,字符串以'UTF-8'編碼方式解碼。使用opt_encoding參數(shù)可以指定一個(gè)不同的格式。
- FileReader.readAsDataURL(Blob|File) - result屬性包含的是以data URL編碼的file/blob數(shù)據(jù)。
- FileReader.readAsArrayBuffer(Blob|File) - result屬性包含的是以ArrayBuffer對象表示的file/blob數(shù)據(jù)。
一旦這些read方法被調(diào)用,onloadstart, onprogress, onload, onabort, onerror, onloadend就可以被用來追蹤進(jìn)度。
<!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)) {
//設(shè)置錯(cuò)誤信息
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);
//讀取文件內(nèi)容
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文件內(nèi)容預(yù)覽(需對<>&'"|等符號進(jìn)行過濾否則會中斷讀取):
<!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)) {
//設(shè)置錯(cuò)誤信息
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);
//讀取文件內(nèi)容
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指定區(qū)域文本內(nèi)容:
<!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方法支持把文件切成不同的片段,第一個(gè)參數(shù)是起始的字節(jié)數(shù),第二個(gè)參數(shù)是結(jié)束的字節(jié)數(shù),還有一個(gè)可選的內(nèi)容類型字符串可以作為第三個(gè)參數(shù)。早期的chrome和firefox版本不支持file.slice 可使用file.webkitSlice和file.mozSlice替代,最新版本均支持file.slice。
6、文件讀取進(jìn)度
<!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>讀取進(jìn)度:</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;
//更新進(jìn)度條
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測試為主。
到此這篇關(guān)于JavaScript文件上傳問題整理的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
js獲取下拉列表框<option>中的value和text的值示例代碼
本篇文章主要是對js獲取下拉列表框<option>中的value和text的值示例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01
JS控制阿拉伯?dāng)?shù)字轉(zhuǎn)為中文大寫示例代碼
阿拉伯?dāng)?shù)字如何轉(zhuǎn)為中文大寫這個(gè)實(shí)現(xiàn)的方法有很多,在本文將為大家介紹下js中時(shí)如何實(shí)現(xiàn)的,感興趣的朋友可以參考下2013-09-09
判斷數(shù)組是否包含某個(gè)元素的js函數(shù)實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄袛鄶?shù)組是否包含某個(gè)元素的js函數(shù)實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05
js+css實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲
這篇文章主要為大家詳細(xì)介紹了js+css實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05

