Как отобразить файл, который может загружать только определенный c пользователь на основе имени пользователя / номера ученика? - PullRequest
0 голосов
/ 21 июня 2020

Я все еще новичок в этом, так что надеюсь, вы понимаете. Я работал над созданием простого студенческого портала для нашего колледжа в эту пандемию c раз.

Я сделаю студенческий портал, чтобы студенты, получившие специальное образование, могли видеть свои собственные электронные документы, загруженные администратором, например хорошие моральные качества, отметки / карточки и другие сертификаты, и вскоре они смогут увидеть свои оценки. Я выполнил интерфейс, регистрацию, вход и выход, но мне трудно кодировать загрузку файлов / документов на сайт.

  1. Что я могу сделать, чтобы загрузить файлы для конкретного c номер ученика?
  2. Могу ли я сопоставить номер ученика с именем файла для загрузки? EG Student Num. = 123456789; имя файла: 123456789.pdf

Еще пример (сценарий):

Студент № 1234568789 хочет загрузить файлы, он / она сначала зарегистрируется, затем войдет в систему и на домашней странице , напрямую (я не буду создавать страницу загрузок), документы, специально предназначенные для него, будут отображаться и доступны для загрузки.

1 Ответ

0 голосов
/ 21 июня 2020

Если вы просто загрузите документы в каталог, следуя какой-то структуре, и будете обслуживать их как файлы 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.

...