Если вы просто загрузите документы в каталог, следуя какой-то структуре, и будете обслуживать их как файлы c stati, ваша система будет уязвима для учащихся, угадывающих путь к файлу других учащихся и загружающих их.
Я думаю, что в идеале вы должны создать таблицу базы данных (attachments
или что-то еще), связанную с таблицей студентов, чтобы хранить путь к документам (который недоступен статически, если бы к нему был доступ напрямую, ваш веб-сервер вернул бы 403 Unauthorized
), затем используйте PHP для извлечения и обслуживания документа, если учащийся авторизован для его просмотра (если он связан с записью учащегося в базе данных).
Что-то вроде:
$currentStudentId = 10; // This would come from the login session
$documentId = 73; // This could come as a URL param
// Fetch the attachment associated to the student from the DB
$query = 'SELECT filepath FROM attachments WHERE student_id = ? AND id = ?';
$stmt = $conn->prepare($query);
$stmt->bind_param('ii', $currentStudentId, $documentId); // Be sure to read about prepared statements if you're using mysqli
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_row();
$attachment = $row[0];
if (!$attachment) {
// Return a 404 if the attachment doesn't exists or it's not associated to this student
http_response_code(404);
die('Attachment not foud');
} else {
// Read and serve the file
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="file.pdf"');
readfile("{$attachment['filepath']}.pdf");
}
Of Конечно, когда файл загружен, вам нужно будет создать запись attachments
в БД, правильно связанную с student_id
и с правильным filepath
. Фактическое имя файла может быть случайным, это не имеет значения, если оно не конфликтует с другими файлами, не доступно статически и правильно сохраняется в таблице attachments
.