HTML5-6【读取文件、分割文件、监控读取文件进度】

一.读取文件

(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>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值