Dropzone.js + php 分块上传

js

<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" type="text/css" href="dist/min/basic.min.css">
    <link rel="stylesheet" type="text/css" href="dist/min/dropzone.min.css">
    <script src="dist/min/dropzone.min.js"></script>
</head>
<body>
<div id="myAwesomeDropzone" class="dropzone"></div>
<script>
    //https://docs.dropzone.dev/configuration/basics/configuration-options
    Dropzone.autoDiscover = false;
    let myDropzone = new Dropzone("#myAwesomeDropzone", {
        url: 'upload.php', //上传地址
        method: 'post', //方式
        uploadMultiple: false,
        chunking: true,//块上传
        chunkSize: 2 * 1024 * 1024,///如果chunking为true,则以字节为单位定义块大小。
        retryChunks: true,//如果块失败,是否应该重试。
		forceChunking:true,//如果启用了分块,这将定义是否**每个**文件都应该被分块,即使文件大小低于chunkSize。这意味着,将提交额外的块表单数据,并调用chunksUploaded回调。
        success: function (file, response) {
            //console.log('上传成功')
        },
        error: function (file, response) {
			//console.log('上传失败')
        },
    });
</script>
</body>
</html>

php

<?php

try {
    set_time_limit(0);

    $uploadFile = $_FILES['file'];

    ///print_r($uploadFile);

    //分块上传

    //当前第几个块
    $dzchunkindex = $_POST['dzchunkindex'];

    //总共块数量
    $dztotalchunkcount = $_POST['dztotalchunkcount'];
    
    ///创建目录
    if (!is_dir('./files-block/')) {
        mkdir('./files-block/');
    }


    //判断文件是否已存在
    if (!file_exists('./files-block/' . $dztotalchunkcount . '_' . $dzchunkindex . '_' . $uploadFile['name'])) {

            //把每个块文件移到临时缓存目录
        move_uploaded_file($uploadFile['tmp_name'], './files-block/' . $dztotalchunkcount . '_' . $dzchunkindex . '_' . $uploadFile['name']);
    }

    // 判断文件是否上传完成
    if ($dzchunkindex == ($dztotalchunkcount - 1)) {

            ///创建目录
        if (!is_dir('./files/')) {
            mkdir('./files/');
        }

        /**
        * 第一种合并文件方法
        */
        /*            // 合并文件
                    $filename = $uploadFile['name'];

                    $fp = fopen('./files/'.$filename, 'w');

                    for ($i = 0; $i < $dztotalchunkcount; $i++) {
                        $chunk = file_get_contents('./files-block/'.$dztotalchunkcount.'_'.$i.'_'.$uploadFile['name']);
                        //print_r($chunk);
                        fwrite($fp, $chunk);
              }
    }
                    fclose($fp); */



        /**
         * 第二种合并文件方法
         */
        //合并文件
        for ($i = 0; $i < $dztotalchunkcount; $i++) {
            file_put_contents('./files/' . $uploadFile['name'], file_get_contents('./files-block/' . $dztotalchunkcount . '_' . $i . '_' . $uploadFile['name']), FILE_APPEND);
        }


        // 合并完成后删除分块文件
        for ($i = 0; $i < $dztotalchunkcount; $i++) {
            unlink('./files-block/' . $dztotalchunkcount . '_' . $i . '_' . $uploadFile['name']);
        }
    }

    print_r(1);
} catch (Exception $e) {
    echo "$e\n";
}

参考:

https://docs.dropzone.dev/configuration/basics/configuration-options

https://github.com/dropzone/dropzone/blob/main/src/options.js#L574

https://www.jianshu.com/p/4b5653da3c28

https://pythonjishu.com/nnazgoubekcchhr/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注




Enter Captcha Here :