What are the best practices for storing and retrieving user-generated content such as certificates in PHP applications?

When storing and retrieving user-generated content such as certificates in PHP applications, it is important to securely store the files on the server and properly handle file uploads to prevent security vulnerabilities. One common approach is to store the files in a designated directory outside of the web root to prevent direct access by users. When retrieving the files, it is important to validate the file path and ensure proper authentication before serving the content to users.

// Storing user-generated content (certificate upload)
$uploadDir = '/path/to/upload/directory/';
$uploadFile = $uploadDir . basename($_FILES['certificate']['name']);

if (move_uploaded_file($_FILES['certificate']['tmp_name'], $uploadFile)) {
    echo "Certificate is valid and was successfully uploaded.";
} else {
    echo "Certificate upload failed.";
}

// Retrieving user-generated content (certificate download)
$certificateFile = '/path/to/upload/directory/certificate.pdf';

if (file_exists($certificateFile)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/pdf');
    header('Content-Disposition: attachment; filename=' . basename($certificateFile));
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($certificateFile));
    readfile($certificateFile);
    exit;
} else {
    echo "Certificate file not found.";
}