php分块上传

原理介绍

本文的分块上传主要是使用html5file对象对文件进行分块,然后一块块进行上传,后端接收上传的每块文件,判断分块是否上传完成,上传完成合并文件并删除所有分块。

demo目录结构

index.php
upload.php
uplod
    block

前端代码

index.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>分片上传</title>
</head>
<body>
    选择文件:
    <input type="file" name="file" id="upload"> <span>等待上传...</span>
    <script src="http://zui.sexy/assets/jquery.js"></script>
    <script type="text/javascript">
        $('#upload').on('change', function() {
            // 文件对象
            var file = $('#upload')[0].files[0];
            // 分块的大小 默认4M
            var block = 1024 * 1024 * 1;
            // 文件大小
            var fileSize = file.size;
            // 总的分块数
            var totalCount = Math.ceil(fileSize / block);
            var start = 0,
                end = 0;
            // 原文件名
            var fileName = file.name;
            // 生成随机的前缀
            var prfix = Math.random();
            for(var num = 0; num < totalCount; num++) {
                start = num * block;
                end = start + block;
                blockFile = file.slice(start, end);
                // 组装 FormData() 对象
                var formData = new FormData();
                formData.append('file', blockFile);
                formData.append('num', num);
                formData.append('fileName', fileName);
                formData.append('prfix', prfix);
                formData.append('totalCount', totalCount);
                $.ajax({
                    url: 'upload.php',
                    type: 'post',
                    data: formData,
                    processData:false,
                    contentType:false,
                    dataType: 'json',
                    successs: function(msg) {
                        console.log(msg);
                    },
                    error: function(err) {
                        console.log(err);
                    }
                });

            }
        });
    </script>
</body>
</html>

后端代码

<?php
class UploadFile
{
    public function upload()
    {
        // 接收 post 参数
        $data = $_POST;
        // 文件信息
        $file = $_FILES;
        // 分块文件上传
        move_uploaded_file($file['file']['tmp_name'], 'upload/block/' . $data['prfix'] . '_' . $data['num']);
        $done = 0;
        // 判断文件是否上传完成
        if ($data['num'] == ($data['totalCount'] - 1)) {
            // 新的文件名
            $ext = pathinfo($data['fileName'], PATHINFO_EXTENSION);
            $newFileName = $data['prfix'] . '.' . $ext;
           // 合并文件
           for($i = 0; $i < $data['totalCount']; $i++) {
                file_put_contents('upload/' . $newFileName, file_get_contents('upload/block/' . $data['prfix'] . '_' . $i));
           }
           // 合并完成后删除分块文件
           for($i = 0; $i < $data['totalCount']; $i++) {
               unlink('upload/block/' . $data['prfix'] . '_' . $i);
           }
           $done = 1;
        }

        echo json_encode([
            'code' => 0,
            'msg' => '文件上传',
            'data' => [
                'donw' => $done,
            ]
        ]);
        
    }

    public function fileExists($fileName)
    {
        if (file_exists('upload/' . $fileName)) {
            return true;
        }
        return false;
    }

    public function dirExists($dir)
    {
        if (!is_dir($dir)) {
            mkdir('upload/' . $dir);
        }
        return true;
    }
}

$upload = new UploadFile();
$upload->upload();
发布了48 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_37825371/article/details/104926207