PHP 分割、合并 大文件
<?php /** * 分割文件 * 默认大小 2M=10485760/5 * * @param string 文件名 * @param float|int $block_size 分块大小 * @return array */ function file_split($file_path = '', $block_size = 10485760 / 5) { if (empty($file_path)) { return []; } $block_info = []; $size = filesize($file_path); $ext = file_ext($file_path); $file_name = str_replace($ext, '', $file_path); $i = 0; while ($size > 0) { $block_info[] =[ 'size' => ($size >= $block_size ? $block_size : $size), 'file' => $file_name . '.' . ($i++) . $ext ]; $size -= $block_size; } $fp = fopen($file_path, "rb"); foreach ($block_info as $bi) { $handle = fopen($bi['file'], "wb"); fwrite($handle, fread($fp, $bi['size'])); fclose($handle); unset($handle); } fclose($fp); unset($fp); return $block_info; } /** * 合并文件 * * @param string $file_path 文件名 * @param string $save_file 另存为的文件名 */ function file_combine($file_path, $save_file = '') { $block_info = []; $ext = file_ext($file_path); $file_name = str_replace($ext, '', $file_path); for ($i = 0; ; $i++) { $split_file_path = $file_name . '.' . $i . $ext; if (file_exists($split_file_path) && filesize($split_file_path) > 0) { $block_info[] = $split_file_path; } else { break; } } if ($save_file) { $fp = fopen($save_file, "wb"); } else { $fp = fopen($file_path, "wb"); } foreach ($block_info as $block_file) { $handle = fopen($block_file, "rb"); fwrite($fp, fread($handle, filesize($block_file))); fclose($handle); unset($handle); } fclose($fp); unset($fp); } /** * 获取文件的扩展名 * * @param string $filename 文件名 * @return string */ function file_ext($filename) { if (empty($filename)) { return ''; } return '.' . strtolower(trim(substr(strrchr($filename, '.'), 1))); } // 测试 $filename = 'D:\123\123456.zip'; // 分割 $ret = file_split($filename); print_r($ret); // 合并 file_combine($filename, 'D:\456\abcdef.zip');
参考: