大文件分块上传

前端代码

使用file.slice将文件进行分割,然后分别进行异步上传。

<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title><%= title %></title>
    <!-- zui -->
    <link rel="stylesheet" href="http://zui.sexy/dist/css/zui.min.css">
  </head>
  <body>
    <div class="container" style="margin-top: 30px;">
        <form class="form-inline" method="post" enctype="multipart/form-data">
          <div class="form-group">
            <input type="file" id="fileBig" class="form-control">
          </div>
          <button type="submit" class="btn btn-primary">提交</button>
        </form>
    </div>
    <!-- ZUI Javascript 依赖 jQuery -->
    <script src="http://zui.sexy/assets/jquery.js"></script>
    <!-- ZUI 标准版压缩后的 JavaScript 文件 -->
    <script src="http://zui.sexy/dist/js/zui.min.js"></script>
    <script type="text/javascript">
        $('form').submit(function() {
            let file = $(":file")[0].files[0];
            let fileName = file.name;
            let fileSize = file.size;
            console.log('fileSize',fileSize);
            let blockSize = 0.9*1024*1024;
            let num = Math.ceil(fileSize/blockSize);
            let start = 0;
            let end = 0;
            for(let i=1;i<=num;i++){
                end = blockSize*i;
                if(end > fileSize){
                    end = fileSize;
                }
                let block = file.slice(start,end);
                start = end;
                let fd = new FormData();
                fd.append('block',block);
                fd.append('name',fileName);
                fd.append('total',num);
                fd.append('index',i);
                $.ajax({
                    url:"upload.php",
                    type:"POST",
                    data:fd,
                    async:true,
                    processData:false,
                    contentType:false,
                    success:(res)=>{
                        console.log('res_'+i+":");
                        console.log(res);
                    }
                })
            }
            return false;
        });
    </script>
  </body>
</html>

后端代码

在所有的文件上传成功之后,合并生成原来的大文件

<?php
$name = $_POST['name'];
$index = $_POST['index'];
$total = $_POST['total'];
echo "name:".$name.PHP_EOL;
echo "index:".$index.PHP_EOL;
echo "total:".$total.PHP_EOL;

move_uploaded_file($_FILES['block']['tmp_name'],'upload/'.$name."_".$index);

$list = scandir('upload');
$num = count($list)-2;
echo "cur_num:".$num.PHP_EOL;
if($num == $total){
    echo "upload done".PHP_EOL;
    echo $cmd = "cat  upload/'{$name}_'* > upload/'{$name}'";
    shell_exec($cmd);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值