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 完成并正常播放:

时间: 2024-10-12 13:05:12

js大文件分割上传的相关文章

android下大文件分割上传

由于android自身的原因,对大文件(如影视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题. 文件分割后分多次请求服务. 1 //文件分割上传 2 public void cutFileUpload(String fileType,String filePath) 3 { 4 try 5 { 6 FileAccessI fileAccessI = new FileAccessI(filePath, 0); 7 Long nStartPo

js实现大文件分片上传的方法

借助js的Blob对象FormData对象可以实现大文件分片上传的功能,关于Blob和FormData的具体使用方法可以到如下地址去查看FormData 对象的使用Blob 对象的使用以下是实现代码,本例中后端代码使用php来实现,只是演示基本功能,具体一些文件验证逻辑先忽略.前段代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <

大文件分片上传

Vue项目中遇到了大文件分片上传的问题,之前用过webuploader,索性就把Vue2.0与webuploader结合起来使用,封装了一个vue的上传组件,使用起来也比较舒爽. 上传就上传吧,为什么搞得那么麻烦,用分片上传? 分片与并发结合,将一个大文件分割成多块,并发上传,极大地提高大文件的上传速度.当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件.另外分片传输能够更加实时的跟踪上传进度. 实现后的界面: 主要是两个文件,封装的上传组件和具体的ui页面,上传组件代码下面有列出来.

大文件分片上传,断点续传,秒传 实现

前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长,请求超时:3,传输中断,必须重新上传导致前功尽弃: 解决方案: 1,修改服务端上传的限制配置:Nginx 以及 PHP 的上传文件限制 不宜过大,一般5M 左右为好: 2,大文件分片,一片一片的传到服务端,再由服务端合并.这么做的好处在于一旦上传失败只是损失一个分片而已,不用整个文件重传,而且每个分

java大文件分片上传插件

我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭浏览器后再打开)仍然能够继续上传,重启电脑后仍然能够上传 支持文件夹的上传,要求服务端能够保留层级结构,并且能够续传.需要支持10万个以上的文件夹上传. 支持低版本的系统和浏览器,因为这个项目

使用AjaxFileUpload.js实现文件异步上传

ajax是无法提交文件的,所以在上传图片并预览的时候,我们经常使用Ifame的方法实现看似异步的效果.但是这样总不是很方便的,AjaxFilleUpload.js对上面的方法进行了一个包装,使得我们不用去管理Iframe的一系列操作,也不用影响我们的页面结构,实现异步的文件提交. html: <input type="file" name="upload" hidden="hidden" id="file_upload"

PHP实现大文件的上传设置

打开php.ini,首先找到 ;;;;;;;;;;;;;;;; ; File Uploads ; ;;;;;;;;;;;;;;;; 区域,有影响文件上传的以下几个参数: file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开 upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指 打开php.ini,首先找到;;;;;;;;;;;;;;;;; File Uploads ;;;;;;;;;;;;;;;;;区域,有影响文件上传的以下几个参数

Ajax实现大文件切割上传

Ajax大文件切割上传 2015-02-07 前面我们已经实现了Ajax的文件上传,不过会受限于服务器的允许的大小, 如果服务器并非自己的,我们就要使用Ajax大文件切割来实现上传. 首先解决Ajax跨域上传问题: 在HTML5中,ajax的跨域有了新的规则-----能否跨域取决于对应的应答. 对方服务器如果愿意接受远程过来的ajax,或某几个域名过来的ajax请求,可以在头信息header中,加入Access-Control-Allow-Origin * 在PHP中加入此信息,就可以实现跨域请

iOS大文件分片上传和断点续传

总结一下大文件分片上传和断点续传的问题.因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况.http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,http协议自动会将文件切片(分块),但这不是我们现在说的重点,我们要做的事是保证在网络中断后1G的文件已上传的那部分在下次网络连接时不必再重传.所以我们本地在上传的时候,要将大文件进行分片,比如分成1024*1024B,即将大文件分成1M的片进行上传,服务器在接收后,再将这些片合并成原始文件,这就是分片的基本原理.断点续