讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在 PHP 中实现大文件分片上传功能_基于 move_uploaded_file 函数

小晨酱_1024

小晨酱_1024

发布时间:2026-05-05 23:15:46

|

1011人浏览过

|

来源于php中文网

原创

不能直接用move_uploaded_file处理大文件,因为PHP和Web服务器的默认上传限制会在脚本执行前拦截大文件,导致$_FILES为空或报413错误;分片上传需前端切片、后端逐片调用move_uploaded_file暂存,再按序合并。

如何在 php 中实现大文件分片上传功能_基于 move_uploaded_file 函数

为什么不能直接用 move_uploaded_file 处理大文件

因为 PHP 默认的上传限制(upload_max_filesize、post_max_size、内存限制)会让大文件在到达 PHP 脚本前就被 Web 服务器(如 Nginx/Apache)或 PHP 自身拦截,move_uploaded_file 根本没机会执行。你看到的常是空 $_FILES、UPLOAD_ERR_NO_FILE 或直接 413 Request Entity Too Large 错误。

分片上传的本质是「前端把一个大文件切小块、逐个 POST、后端拼接」,move_uploaded_file 只负责单次接收后的安全落地,它不处理分片逻辑,也不合并文件——那是你得自己写的部分。

  • Web 服务器需放宽请求体限制(Nginx:调整 client_max_body_size;Apache:LimitRequestBody)
  • PHP 配置中 upload_max_filesize 和 post_max_size 建议设为 2M–8M(够单片即可),而非几十 MB
  • max_execution_time 和 max_input_time 也要适当调高,避免单片上传超时中断

分片上传后端接收的关键三步(含 move_uploaded_file 调用时机)

每一片上传请求应携带唯一标识(如 file_id)、分片序号(chunk_index)、总片数(total_chunks),后端据此决定是暂存还是合并。

move_uploaded_file 必须用在「单片临时文件已存在且校验通过后」,不能跳过临时文件直接操作原始流——PHP 不允许。

立即学习“PHP免费学习笔记(深入)”;

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载
  • 检查 $_FILES['file']['error'] === UPLOAD_ERR_OK,否则跳过 move_uploaded_file
  • 生成安全的临时路径,例如:/tmp/uploads/{$file_id}/chunk_{$chunk_index},确保目录可写且隔离
  • 调用 move_uploaded_file($_FILES['file']['tmp_name'], $target_path) 落地当前分片
  • 记录该分片状态(如写入 Redis 或数据库),用于后续合并判断和断点续传

如何安全合并所有分片(不用 move_uploaded_file,但依赖它前期结果)

合并不是靠 move_uploaded_file,而是用 fopen/fwrite 或 file_put_contents(..., FILE_APPEND) 按序读取各分片并写入目标文件。关键在于顺序和完整性校验。

别在合并时再用 move_uploaded_file —— 它只接受 $_FILES 提供的临时文件路径,而分片已移出临时目录,不再是“上传临时文件”了。

  • 先确认所有分片已存在且大小匹配(比对 $_POST['chunk_size'] 或计算 MD5)
  • 按 chunk_index 升序打开每个分片(fopen($chunk_path, 'rb')),用 stream_copy_to_stream 追加到目标文件
  • 合并完成后,用 unlink 批量清理分片目录,防止磁盘占满
  • 若需原子性,先写到 .part 后缀文件,合并完成再 rename 成正式名

容易被忽略的坑:分片重复、并发冲突与清理失效

前端可能因网络重试重复提交同一片,或多个标签页同时上传同名文件,导致分片覆盖或错乱。这些不会报错,但最终文件损坏。

move_uploaded_file 本身不防重,你要靠业务层控制。

  • 用 file_id + chunk_index 做唯一键,入库前查重,重复则直接返回成功(幂等)
  • 写分片前加文件锁(flock)或 Redis 分布式锁,避免多请求同时写同一分片
  • 设置分片目录自动过期机制(如用 filemtime 清理 2 小时未完成的上传)
  • 不要依赖 $_FILES['file']['name'] 构建路径——它不可信,必须用服务端生成的 file_id

分片上传真正难的不是 move_uploaded_file 怎么调,而是怎么让几十个 HTTP 请求协作无误地还原出原始字节流。函数只是工具,状态管理、并发控制、失败回滚才是核心。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

10504

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

6161

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2115

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

3888

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4594

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3591

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5137

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4022

2023.11.13

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

40

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn