ไฟล์ขนาดใหญ่อัปโหลดได้ด้วย PHP สองวิธี ทั้งสองวิธีอธิบายด้านล่าง:
- เปลี่ยนค่า upload_max_filesize ในไฟล์ php.ini
- ใช้ file chunk upload แบ่งอัปโหลดเป็นชิ้นเล็กๆ แล้วประกอบรวมเมื่ออัปโหลดเสร็จ
อัปเดต php.ini ดังนี้:
upload_max_filesize = 50M post_max_size = 50M max_input_time = 300 max_execution_time = 300
ควรหลีกเลี่ยงเพราะจะเปลี่ยนการตั้งค่าเซิร์ฟเวอร์และโปรเจกต์อื่นๆ
อัปเดตไฟล์ htaccess
php_value upload_max_filesize 50M php_value post_max_size 50M php_value max_input_time 300 php_value max_execution_time 300
เปลี่ยนการตั้งค่า inline:
<?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); ?>Chunking
ในกระบวนการนี้ ไฟล์ขนาดใหญ่ถูกแบ่งเป็นส่วนเล็กๆ แล้วอัปโหลด ไลบรารี 'Plupload' สามารถดาวน์โหลดและใช้ได้
<?php // ฟังก์ชันตอบสนอง function verbose($ok=1,$info=""){ // ล้มเหลวในการอัปโหลด โยน error 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; // จัดการ 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"); } // ตรวจสอบว่าไฟล์อัปโหลดเสร็จ if (!$chunks || $chunk == $chunks - 1) { rename("{$filePath}.part", $filePath); } verbose(1, "Upload OK"); ?>เมื่อพยายามอัปโหลดไฟล์ขนาดใหญ่กว่า 500 MB จะอัปโหลดสำเร็จ