基于php+webuploader的大文件分片上传,支持断点续传,带进度条

以下是一个使用PHP和WebUploader实现大文件分片上传,支持断点续传的示例代码。

首先,确保你已经安装了WebUploader前端库和PHP环境。

前端(HTML + JavaScript):




<!DOCTYPE html>
<html>
<head>
    <title>大文件分片上传</title>
    <script src="//cdn.jsdelivr.net/npm/webuploader/dist/webuploader.min.js"></script>
</head>
<body>
<div id="uploader">
    <div class="btns">
        <div id="filePicker">选择文件</div>
        <button id="uploadBtn">开始上传</button>
    </div>
    <div class="progress">
        <div id="progressBar" style="width: 0%;">0%</div>
    </div>
</div>
 
<script>
    var uploader = WebUploader.create({
        auto: true,
        server: 'upload.php',
        pick: '#filePicker',
        chunked: true, // 开启分片上传
        chunkSize: 1024 * 1024, // 每片1MB
        threads: 3,
    });
 
    uploader.on('uploadProgress', function (file, percentage) {
        var $progressBar = $('#progressBar');
        $progressBar.width(percentage * 100 + '%');
        $progressBar.text(Math.floor(percentage * 100) + '%');
    });
 
    $('#uploadBtn').click(function () {
        uploader.upload();
    });
</script>
</body>
</html>

后端 (PHP):




<?php
$config = [
    'rootPath' => './uploads/',
    'mergeDir' => './merge/',
    'mergeFile' => 'uploaded_file.dat',
];
 
$chunkIndex = isset($_POST['chunk']) ? intval($_POST['chunk']) : 0;
$chunkTotal = isset($_POST['chunks']) ? intval($_POST['chunks']) : 1;
$fileName = isset($_POST['name']) ? $_POST['name'] : '';
$filePath = $config['rootPath'] . $fileName;
$mergeDir = $config['mergeDir'];
$mergeFile = $mergeDir . $config['mergeFile'];
 
if (!is_dir($mergeDir)) {
    mkdir($mergeDir, 0777, true);
}
 
// 分片上传
if (!file_exists($filePath) && $chunkIndex == 0) {
    // 第一个分片创建空文件
    file_put_contents($filePath, '');
}
 
// 保存分片
move_uploaded_file($_FILES['file']['tmp_name'], $filePath . '.part' . $chunkIndex);
 
// 所有分片上传完毕进行合并
if (($chunkIndex + 1) == $chunkTotal) {
    // 合并分片
    $in = fopen($mergeFile, 'ab');
    for ($i = 0; $i < $chunkTotal; $i++) {
        $filePathTmp = $filePath . '.part' . $i;
        $inStream = fopen($filePathTmp, 'rb');
        stream_copy_to_stream($inStream, $in);
        fclose($inStream);
        unlink($filePathTmp);
    }
    fclose($in);
    // 处理完成,删除分片文件
    unlink($filePath);
}
 
echo json_encode(['success' => true]);
?>

这个示例中,前端使用WebUploader进行文件分片,后端接收分片并进行存储,最后当所有分片上传完毕时合并文件。合并后的文件可以进行后续处理,例如存储或转码。

PHP
最后修改于:2024年08月27日 20:01

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日