欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript文件上傳的常見問題整理

 更新時(shí)間:2022年06月27日 15:05:48   作者:小旭2021  
這篇文章整理了JavaScript文件上傳的常見問題,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

文件上傳:<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)的文件格式,可手動(dòng)修改成其它文件格式。

如果不限制上傳圖片的格式可寫成: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對(duì)象都是一組文件對(duì)象的集合,而文件對(duì)象則擁有下列的屬性:
name – 文件名(不包含路徑)
type – 文件的MIME類型(小寫)
size – 文件的尺寸(單位為字節(jié))

lastModifiedDate 為上傳文件的最后修改時(shí)間

通過上面的幾個(gè)對(duì)象,我們能夠控制用戶上傳的文件大小和文件類型,以便減輕服務(wù)器再次檢測(cè)時(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、拖動(dòng)上傳

dataTransfer 對(duì)象

dropEffect[=sCursorStyle]

設(shè)置或獲取拖拽操作的類型和要顯示的光標(biāo)類型

  • copy:復(fù)制樣式被顯示
  • link:鏈接樣式被顯示
  • move:移動(dòng)樣式被顯示
  • none:默認(rèn),沒有鼠標(biāo)樣式被定義

effectAllowed[=sEffect]
設(shè)置或獲取數(shù)據(jù)傳送操作可應(yīng)用與該對(duì)象的源元素

  • copy 選項(xiàng)被復(fù)制
  • link 選項(xiàng)被dataTransfer作為link方式保存
  • move 當(dāng)放置時(shí),對(duì)象被移動(dòng)至目標(biāo)對(duì)象
  • copylink 選項(xiàng)是被復(fù)制還是被作為link方式保存關(guān)鍵在于目標(biāo)對(duì)象
  • linkmove 選項(xiàng)是被作為link方式保存還是被移動(dòng)關(guān)鍵在于目標(biāo)對(duì)象
  • all 所有效果都被支持
  • none 不支持任何效果
  • uninitialized 默認(rèn)不能通過這個(gè)屬性傳遞任何值

setData(sFormat,sData) 將指定格式的數(shù)據(jù)賦值給dataTransfer或者clipboardData sFormat:URL,Text
getData(sFormat) 從dataTransfer或者clipboardData中獲取值 sFormat:URL,Text
clearData([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對(duì)象表示的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ù)覽(需對(duì)<>&'"|等符號(hào)進(jìn)行過濾否則會(huì)中斷讀取):

<!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('請(qǐng)選擇文件'); 
        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測(cè)試為主。

到此這篇關(guān)于JavaScript文件上傳問題整理的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JS實(shí)現(xiàn)簡(jiǎn)單可拖動(dòng)的模態(tài)框

    JS實(shí)現(xiàn)簡(jiǎn)單可拖動(dòng)的模態(tài)框

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)簡(jiǎn)單可拖動(dòng)的模態(tài)框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • JS字符串截取出現(xiàn)的bug以及解決方式

    JS字符串截取出現(xiàn)的bug以及解決方式

    之前在獲取元素屬性時(shí),踩了個(gè)坑,記錄一下,下面這篇文章主要給大家介紹了關(guān)于JS字符串截取出現(xiàn)的bug以及解決方式,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • JavaScript和CSS交互的方法匯總

    JavaScript和CSS交互的方法匯總

    本文總結(jié)了5種javascript與CSS交互的方法,都是平時(shí)項(xiàng)目中經(jīng)常用到的,這里推薦給大家
    2014-12-12
  • JavaScript惰性求值的一種實(shí)現(xiàn)方法示例

    JavaScript惰性求值的一種實(shí)現(xiàn)方法示例

    這篇文章主要給大家介紹了關(guān)于JavaScript惰性求值的一種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • js中forEach,for in,for of循環(huán)的用法示例小結(jié)

    js中forEach,for in,for of循環(huán)的用法示例小結(jié)

    這篇文章主要介紹了js中forEach,for in,for of循環(huán)的用法,結(jié)合實(shí)例形式總結(jié)分析了js中forEach,for in,for of循環(huán)相關(guān)使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • 詳解JavaScript狀態(tài)容器Redux

    詳解JavaScript狀態(tài)容器Redux

    Redux官網(wǎng)上是這樣描述Redux,Redux is a predictable state container for JavaScript apps.(Redux是JavaScript狀態(tài)容器,提供可預(yù)測(cè)性的狀態(tài)管理)。目前Redux GitHub有5w多star,足以說明 Redux 受歡迎的程度
    2021-06-06
  • js獲取視頻時(shí)長(zhǎng)代碼

    js獲取視頻時(shí)長(zhǎng)代碼

    下面的這段js獲取視頻時(shí)長(zhǎng)代碼是網(wǎng)上找的,還沒有測(cè)試,需要的朋友可以參考下
    2014-04-04
  • javascript實(shí)現(xiàn)輸出指定行數(shù)正方形圖案的方法

    javascript實(shí)現(xiàn)輸出指定行數(shù)正方形圖案的方法

    這篇文章主要介紹了javascript實(shí)現(xiàn)輸出指定行數(shù)正方形圖案的方法,可實(shí)現(xiàn)javascript獲取用戶輸入及根據(jù)輸入?yún)?shù)打印圖形的功能,需要的朋友可以參考下
    2015-08-08
  • 微信小程序傳值以及獲取值方法的詳解

    微信小程序傳值以及獲取值方法的詳解

    這篇文章主要介紹了微信小程序傳值以及獲取值方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • javascript table排序 這個(gè)更簡(jiǎn)單了,不用改變現(xiàn)在的表格結(jié)構(gòu)

    javascript table排序 這個(gè)更簡(jiǎn)單了,不用改變現(xiàn)在的表格結(jié)構(gòu)

    另外一個(gè)table排序,這個(gè)更簡(jiǎn)單了,不用改變現(xiàn)在的表格結(jié)構(gòu),來自國(guó)外的代碼。
    2010-04-04

最新評(píng)論