如何使用 PHP 上传 500MB 以上的大文件?

phpserver side programmingprogramming更新于 2025/6/28 1:52:17

使用 PHP 可以通过两种方式上传大文件。这两种方法都在下面讨论 −

  • 通过更改 php.ini 文件中的 upload_max_filesize 限制。
  • 通过实现文件分块上传,将上传内容拆分成更小的部分,并在上传完成后重新组装这些部分。

php.ini 文件可以按如下所示更新 −

upload_max_filesize = 50M
post_max_size = 50M
max_input_time = 300
max_execution_time = 300

应避免此操作,因为它会更改服务器和其他项目的设置。

更新 htacess 文件

php_value upload_max_filesize 50M
php_value post_max_size 50M
php_value max_input_time 300
php_value max_execution_time 300

更改内联设置 −

<?php
   // 更改上传限制
   ini_set('upload_max_filesize', '50M');
   ini_set('post_max_size', '50M');
   ini_set('max_input_time', 300);
   ini_set('max_execution_time', 300);
   // 目标文件夹已设置
   $source = $_FILES["file-upload"]["tmp_name"];
   $destination = $_FILES["file-upload"]["name"];
   // 已上传文件夹移动到目标文件夹
   move_uploaded_file($source, $destination);
?>

分块

在此过程中,将大文件拆分成较小的部分,然后上传。‘Plupload’ 库可供下载和使用。

<?php
   // 响应函数
   function verbose($ok=1,$info=""){
      // 上传失败抛出 400 错误
      if ($ok==0) { http_response_code(400); }
      die(json_encode(["ok"=>$ok, "info"=>$info]));
   }
   // 上传无效
   if (empty($_FILES) || $_FILES['file']['error']) {
      verbose(0, "Failed to move uploaded file.");
   }
   // 上传目的地
   $filePath = __DIR__ . DIRECTORY_SEPARATOR . "uploads";
   if (!file_exists($filePath)) {
      if (!mkdir($filePath, 0777, true)) {
         verbose(0, "Failed to create $filePath");
      }
   }
   $fileName = isset($_REQUEST["name"]) ? $_REQUEST["name"] : $_FILES["file"]["name"];
   $filePath = $filePath . DIRECTORY_SEPARATOR . $fileName;
   // 处理块
   $chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0;
   $chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 0;
   $out = @fopen("{$filePath}.part", $chunk == 0 ? "wb" : "ab");
   if ($out) {
      $in = @fopen($_FILES['file']['tmp_name'], "rb");
      if ($in) {
         while ($buff = fread($in, 4096)) { fwrite($out, $buff); }
      } else {
         verbose(0, "Failed to open input stream");
      }
      @fclose($in);
      @fclose($out);
      @unlink($_FILES['file']['tmp_name']);
   } else {
      verbose(0, "Failed to open output stream");
   }
   // 检查文件是否已上传
   if (!$chunks || $chunk == $chunks - 1) {
      rename("{$filePath}.part", $filePath);
   }
   verbose(1, "Upload OK");
?>

当尝试上传大于 500 MB 的文件时,文件上传成功。


相关文章