上传卡住或报错因PHP默认upload_max_filesize仅2MB,须同步调大upload_max_filesize、post_max_size及Nginx的client_max_body_size,并建议分片上传;视频路径存数据库前需白名单校验扩展名、生成唯一文件名、存相对路径且禁用目录执行权限;防盗链须将视频移出Web根目录,通过PHP校验token后readfile输出;删除时需检查文件可写性、确保DB与文件操作原子性,并排查进程占用。

上传视频时为什么总卡在 0% 或报 upload_max_filesize 错误
PHP 默认限制单个文件上传大小(通常为 2MB),远低于视频文件常见体积。不改配置就直接调用 $_FILES,会静默失败或卡住进度条。
- 必须同时修改 php.ini 中两个参数:
upload_max_filesize和post_max_size(后者需 ≥ 前者) - 若用 Nginx,还需检查
client_max_body_size,否则请求根本到不了 PHP 层 - 大文件上传建议启用分片上传(如用
WebUploader或Uppy前端库),后端配合move_uploaded_file()合并临时分片
怎么安全地保存用户上传的视频路径到数据库
不能直接存前端传来的原始文件名或路径,否则可能被构造恶意文件名(如 ../../etc/passwd.mp4)或覆盖系统文件。
- 用
pathinfo($filename, PATHINFO_EXTENSION)提取扩展名,白名单校验(只允许mp4、webm、mov) - 生成唯一文件名:
uniqid() . '_' . mt_rand(1000, 9999) . '.' . $ext - 保存路径用相对路径(如
uploads/videos/2024/06/xxx.mp4),数据库只存该路径,不要存绝对路径或 URL - 确保上传目录无执行权限(Apache/Nginx 配置中禁用
php_flag engine off或类似规则)
播放页如何防止视频资源被直接盗链或批量下载
单纯把视频放在 web 目录下,任何人都能拼出 URL 下载,管理后台的“资源保护”就形同虚设。
信通购物网Infocomhop(Struts2+Hibernate+Spring+MySQL)是以JSP+MySQL进行开发的JSP购物网站源码。前台:1、会员功能:注册会员,修改会员资料;登录系统后可以选购商品,放入购物车(修改购物数量、删除购物车里的内容),继续购物,最后确认下订单,在线支付所选商品所选商品所需支付的金额;2、新闻频道功能:最新新闻,新闻列表及页面显示。后台:1、会员管理:会员
- 把视频文件放到 Web 根目录之外(如
/var/www/private/videos/),通过 PHP 脚本中转输出 - 用
readfile()+header('Content-Type: video/mp4')输出,并校验 session 或 token(例如:播放 URL 带一次性token=abc123,后端验证后才输出) - Nginx 可加
valid_referers限制 Referer,但仅防低级盗链;关键资源必须走 PHP 校验逻辑
if (isset($_GET['v']) && isset($_GET['t'])) {
$file_id = $_GET['v'];
$token = $_GET['t'];
if (!hash_equals(hash_hmac('sha256', $file_id, $_SESSION['secret']), $token)) {
http_response_code(403);
exit;
}
$real_path = '/var/www/private/videos/' . $file_id . '.mp4';
if (file_exists($real_path)) {
header('Content-Type: video/mp4');
header('Content-Length: ' . filesize($real_path));
readfile($real_path);
}
}
删除视频时为什么磁盘空间没释放,或报 Permission denied
PHP 进程用户(如 www-data 或 nginx)可能没有权限删除某些文件,尤其当文件是 FTP 上传或由其他用户创建时。
立即学习“PHP免费学习笔记(深入)”;
- 删除前先用
is_writable($filepath)检查可写性,失败则记录日志并提示管理员 - 数据库删记录和文件删除必须放在同一事务中(若用 MySQL InnoDB),或至少用
try/catch包裹,避免只删 DB 不删文件 - 注意:
unlink()不回收磁盘空间?其实是缓存或挂载问题,但更常见的是文件仍被进程占用(如 FFmpeg 正在转码、Nginx 正在 serving),删前可用lsof检查










