js大文件分割上传

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js大文件分割上传相关的知识,希望对你有一定的参考价值。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<title>分割大文件上传</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
    #test{
        width: 200px;
        height: 100px;
        border: 1px solid green;
        display: none;
    }
    #img{
        width: 50px;
        height: 50px;
        display: none;
    }
    #upimg{
        text-align: center;
        font: 8px/10px ‘微软雅黑‘,‘黑体‘,sans-serif;
        width: 300px;
        height: 10px;
        border: 1px solid green;
    }
    #load{
        width: 0%;
        height: 100%;
        background: green;
        text-align: center;
    }
</style>
</head>
    <body>
        <form enctype="multipart/form-data" action="file.php" method="post">
            <!-- 
            <input type="file" name="pic" />
            <div id="img"></div>
            <input type="button" value="uploadimg" onclick="upimg();" /><br />
            -->
            <div id="upimg">
                <div id="load"></div>
            </div>
            <input type="file" name="mof" multiple="multiple"/>
            <input type="button" value="uploadfile" onclick="upfile();" />
            <input type="submit" value="submit" />
        </form>
        <div id="test">
            测试是否DIV消失
        </div>
<script type="text/javascript">
    var dom=document.getElementsByTagName(form)[0];
    dom.onsubmit=function(){
        //return false;
    }
    var xhr=new XMLHttpRequest();
    var fd;
    var des=document.getElementById(load);
    var num=document.getElementById(upimg);
    var file;
    const LENGTH=10*1024*1024;
    var start;
    var end;
    var blob;
    var pecent;
    var filename;
    //var pending;
    //var clock;
    function upfile(){
        start=0;
        end=LENGTH+start;
        //pending=false;

        file=document.getElementsByName(mof)[0].files[0];
        //filename = file.name;
        if(!file){
            alert(请选择文件);
            return;
        }
        //clock=setInterval(‘up()‘,1000);
        up();

    }

    function up(){
        /*
        if(pending){
            return;
        }
        */
        if(start<file.size){
            xhr.open(POST,file.php,true);
            //xhr.setRequestHeader(‘Content-Type‘,‘application/x-www-form-urlencoded‘);
            xhr.onreadystatechange=function(){
                if(this.readyState==4){
                    if(this.status>=200&&this.status<300){
                        if(this.responseText.indexOf(failed) >= 0){
                            //alert(this.responseText);
                            alert(文件发送失败,请重新发送);
                            des.style.width=0%;
                            //num.innerHTML=‘‘;
                            //clearInterval(clock);
                        }else{
                            //alert(this.responseText)
                            // pending=false;
                            start=end;
                            end=start+LENGTH;
                            setTimeout(up(),1000);
                        }

                    }
                }
            }
            xhr.upload.onprogress=function(ev){
                if(ev.lengthComputable){
                    pecent=100*(ev.loaded+start)/file.size;
                    if(pecent>100){
                        pecent=100;
                    }
                    //num.innerHTML=parseInt(pecent)+‘%‘;
                    des.style.width=pecent+%;
                    des.innerHTML = parseInt(pecent)+%
                }
            }
       
       //分割文件核心部分slice blob
=file.slice(start,end); fd=new FormData(); fd.append(mof,blob); fd.append(test,file.name); //console.log(fd); //pending=true; xhr.send(fd); }else{ //clearInterval(clock); } } function change(){ des.style.width=0%; } </script> </body> </html>

file.php:

<?php 
/****
    waited
****/
//print_r($_FILES);exit;

$file = $_FILES[‘mof‘];

$type = trim(strrchr($_POST[‘test‘], ‘.‘),‘.‘);

// print_r($_POST[‘test‘]);exit;

if($file[‘error‘]==0){
    if(!file_exists(‘./upload/upload.‘.$type)){
        if(!move_uploaded_file($file[‘tmp_name‘],‘./upload/upload.‘.$type)){
            echo ‘failed‘;
        }
    }else{
        $content=file_get_contents($file[‘tmp_name‘]);
        if (!file_put_contents(‘./upload/upload.‘.$type, $content,FILE_APPEND)) {
            echo ‘failed‘;
        }
    }
}else{
    echo ‘failed‘;
}

?>

1 运行:

技术分享

2 选择2G文件测试:

技术分享

技术分享

3 完成并正常播放:

技术分享

技术分享

以上是关于js大文件分割上传的主要内容,如果未能解决你的问题,请参考以下文章

文件/大文件上传功能实现(JS+PHP)全过程

PHP实现大文件分割上传与分片上传

Java-使用IO流对大文件进行分割和分割后的合并

Java-使用IO流对大文件进行分割和分割后的合并

FTP大文件的打包分割上传

大文件上传前台分片后后台合并的问题