Computer >> Máy Tính >  >> Lập trình >> PHP

Làm cách nào để tải lên các tệp lớn trên 500MB bằng PHP?

Các tệp lớn có thể được tải lên bằng PHP theo hai cách. Cả hai chúng đều được thảo luận dưới đây -

  • Bằng cách thay đổi giới hạn upload_max_filesize trong tệp php.ini.
  • Bằng cách triển khai tải lên từng đoạn tệp, sẽ chia quá trình tải lên thành các phần nhỏ hơn để lắp ráp các phần này khi quá trình tải lên hoàn tất.

Tệp php.ini có thể được cập nhật như hình dưới đây -

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

Điều này nên tránh vì nó sẽ thay đổi cài đặt của máy chủ và các dự án khác.

Cập nhật tệp 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

Thay đổi cài đặt nội tuyến -

<?php
   // changing the upload limits
   ini_set('upload_max_filesize', '50M');
   ini_set('post_max_size', '50M');
   ini_set('max_input_time', 300);
   ini_set('max_execution_time', 300);
   // destination folder is set
   $source = $_FILES["file-upload"]["tmp_name"];
   $destination = $_FILES["file-upload"]["name"];
   // uploaded folder is moved to the destination
   move_uploaded_file($source, $destination);
?>

Lộn xộn

Trong quá trình này, một tệp lớn được chia thành các phần nhỏ hơn và sau đó được tải lên. Thư viện ‘Plupload’ có thể được tải xuống và sử dụng.

<?php
   // the response function
   function verbose($ok=1,$info=""){
      // failure to upload throws 400 error
      if ($ok==0) { http_response_code(400); }
      die(json_encode(["ok"=>$ok, "info"=>$info]));
   }
   // invalid upload
   if (empty($_FILES) || $_FILES['file']['error']) {
      verbose(0, "Failed to move uploaded file.");
   }
   // upload destination
   $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;
   // dealing with the chunks
   $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");
   }
   // check if file was uploaded
   if (!$chunks || $chunk == $chunks - 1) {
      rename("{$filePath}.part", $filePath);
   }
   verbose(1, "Upload OK");
?>

Khi một tệp có kích thước lớn hơn 500 MB được cố gắng tải lên, tệp đó sẽ được tải lên thành công.