在PHP中处理大文件上传需要考虑多个方面,包括配置服务器、优化PHP设置、编写安全的上传逻辑以及处理客户端。以下是一些关键步骤和最佳实践:
配置服务器:
php.ini文件中的upload_max_filesize和post_max_size设置,以允许更大的文件上传。例如:
upload_max_filesize = 100M
post_max_size = 100M
client_max_body_size指令。例如:
location / {
client_max_body_size 100M;
}
优化PHP设置:
memory_limit设置,确保PHP有足够的内存来处理大文件。例如:
memory_limit = 256M
max_execution_time和max_input_time设置,确保脚本有足够的时间执行。例如:
max_execution_time = 300
max_input_time = 300
编写安全的上传逻辑:
$allowed_types = ['jpg', 'png', 'pdf'];
$file_extension = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
if (!in_array($file_extension, $allowed_types)) {
die("Invalid file type.");
}
$file_name = uniqid() . '.' . $file_extension;
move_uploaded_file($_FILES['file']['tmp_name'], "uploads/" . $file_name);
if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) {
die("File upload failed with error code " . $_FILES['file']['error']);
}
处理客户端:
以下是一个简单的PHP上传示例:
<?php
$allowed_types = ['jpg', 'png', 'pdf'];
$max_size = 100 * 1024 * 1024; // 100MB
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['file'])) {
$file = $_FILES['file'];
$file_size = $file['size'];
$file_tmp_name = $file['tmp_name'];
$file_type = $file['type'];
$file_name = $file['name'];
$file_extension = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
if ($file_size > $max_size) {
die("File size exceeds the maximum allowed size.");
}
if (!in_array($file_extension, $allowed_types)) {
die("Invalid file type.");
}
if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) {
die("File upload failed with error code " . $_FILES['file']['error']);
}
$new_file_name = uniqid() . '.' . $file_extension;
move_uploaded_file($file_tmp_name, "uploads/" . $new_file_name);
echo "File uploaded successfully: " . $new_file_name;
}
?>
<form action="upload.php" method="post" enctype="multipart/form-data">
Select file to upload:
<input type="file" name="file">
<input type="submit" value="Upload File">
</form>