1. 程式人生 > 其它 >HTML5-6【讀取檔案、分割檔案、監控讀取檔案進度】

HTML5-6【讀取檔案、分割檔案、監控讀取檔案進度】

技術標籤:HTML5javascripthtml5

一.讀取檔案

(1).檔案讀取

<input type="file" id="fileInput"/>
    <script>
        let input = document.getElementById('fileInput');
        input.addEventListener('change',(e)=>{
            let reader = new FileReader();
            reader.onload = ()=>{
                console.log(reader.result);
            }
            reader.readAsText(input.files[0]);
        },false)
    </script>

(2).圖片讀取

 <input type="file" id="fileInput"/>
    <script>
        let input = document.getElementById('fileInput');
        input.addEventListener('change',(e)=>{
            let reader = new FileReader();
            reader.onload = ()=>{
               let img = new Image();
               img.src = reader.result;
               document.body.appendChild(img);
            }
            reader.readAsDataURL(input.files[0]);
        },false)
    </script>

二.分割檔案

(1).分割方法

let blob = file.slice(startingByte,endingByte)

(2).實際案例

<body>
    <input type="file" id="files" name="file"/>
    讀取的位元組:
    <span class="readBytesButtons">
        <button data-startbyte="0" data-endbyte="4">1-5</button>
        <button data-startbyte="5" data-endbyte="14">6-15</button>
        <button data-startbyte="6" data-endbyte="7">7-8</button>
        <button>整個檔案</button>
    </span>
    <div id="byteRange"></div>
    <div id="byteContent"></div>
    <script>
        let readBytesButtons = document.getElementsByClassName('readBytesButtons')[0],
            inputFiles = document.getElementById('files');
        function readBlob(startByte,stopByte){
            let files = inputFiles.files;
            if(!files.length){
                alert('請選擇一個檔案');
                return;
            }
            let file = files[0],
                start = parseInt(startByte) || 0,
                stop = parseInt(stopByte) || file.size - 1,
                byteRange = document.getElementById('byteRange'),
                byteContent = document.getElementById('byteContent');
            let reader = new FileReader();
            reader.onloadend = (e)=>{
                if(e.target.readyState == FileReader.DONE){
                    byteRange.textContent = `Read bytes: ${start+1} - ${stop+1} of ${file.size} bytes file`
                    byteContent.textContent = e.target.result;
                }
            }     
            let blob = file.slice(start,stop+1);
            reader.readAsBinaryString(blob);

        }    
        readBytesButtons.addEventListener('click',(e)=>{
            if(e.target.tagName.toLowerCase() == 'button'){
                let startByte = e.target.getAttribute('data-startbyte'),
                    endByte = e.target.getAttribute('data-endbyte')
                readBlob(startByte,endByte)    
            }
        })
    </script>
</body>

三.監控讀取檔案進度

onloadstart

onprogress

<style>
        #progressBar{
            width: 500px;
            margin: 10px 0;
            padding: 3px;
            border: 1px solid #000;
            font-size: 14px;
            opacity: 0;
            transition: opacity 1s linear;
        }
        #progressBar.loading{
            opacity: 1;
        }
        #progressBar .percent{
            background-color: #99ccff;
            height: auto;
            width: 0;
        }
    </style>
</head>
<body>
    <input type="file" id="files">
    <button onclick="abortRead()">取消讀取</button>
    <div id="progressBar">
        <div class="percent">0%</div>
    </div>
    <script>
        let files = document.getElementById('files'),
            percent = document.getElementsByClassName('percent')[0],
            progressBar = document.getElementById('progressBar'),
            reader;
        function updateProgress(e){
            if(e.lengthComputable){
                let percentLoaded = Math.round((e.loaded/e.total)*100);
                if(percentLoaded < 100){
                    percent.style.width = percentLoaded + '%';
                    percent.textContent = percentLoaded + '%';
                }
            }
        }  
        function errorHandler(e){
            switch(e.target.error.code){
                case e.target.error.NOT_FOUND_ERR:
                    alert('檔案未找到');
                    break;
                case e.target.error.NOT_READABLE_ERR:
                    alert('檔案不可讀取');
                    break;
                case e.target.error.ABORT_ERR:
                    break;     
                default:
                    alert('在讀取檔案的過程中,發生了一個錯誤')    
            }
        }  
        function abortRead(){
            reader.abort();
        }
        function handleFileSelect(e){
            percent.style.width = '0%';
            percent.textContent = '0%';
            reader = new FileReader();
            reader.onloadstart = ()=>{
                progressBar.className = 'loading';
            }
            reader.onprogress = updateProgress;
            reader.onload=(e)=>{
                percent.style.width = '100%';
                percent.textContent = '100%';
            }
            reader.onerror = errorHandler
            reader.onabort = (e)=>{
                alert('檔案已經取消')
            }
            reader.readAsDataURL(e.target.files[0]);
        }
        files.addEventListener('change',handleFileSelect,false)
    </script>
</body>