Я работаю над веб-приложением PHP на веб-сервере Linux для оценок и документов для курса, который я преподаю. Страница, которую я сейчас пишу, предназначена для отправки заданий, где студент выбирает задание из выпадающего меню, а затем загружает задание и отправляет. При отправке вся информация о представлении попадает в таблицу MySQL, и файл перемещается в постоянное место в файловой системе. В идеале это должно быть что-то очень организованное по назначению, студенту и версии, но все, что я хочу сейчас, - это чтобы загрузка файла работала в принципе, так что сейчас он просто отправляет материал в каталог ~ / phptest / (разрешения для которого установлены на 755, хотя я пробовал 777 только для испытаний, и это тоже не сработало). Вот код, как сейчас:
($ dbh - это экземпляр расширенного класса дескриптора БД, который я создал, чтобы сделать эти конкретные транзакции БД более чистыми)
if(isset($_POST['submit'])) {
$assignmentID = $_POST['assID'];
$tmp = "/home/username/phptest/";
$info = pathinfo($_FILES['file']['name']);
$filename = $info['basename'];
$ext = $info['extension'];
if(1) { //strcmpall($ext,array('tar.gz','zip'))) {
if($_FILES['file']['size'] < 1000000) {
$path = $tmp . $filename;
if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
$versionQuery = $dbh->select(array('version'),array('a01_submissions'),array("studentID='$studentID'","assignmentID='$assignmentID'"));
if(count($versionQuery)) {
$versionArray = $dbh->colToArray($versionQuery,'version');
$version = max($versionArray)+1;
}
else $version = 1;
echo "Version $version.\n";
$week = $dbh->getOne('week','a01_assignments','id',$assignmentID);
$dbh->insert("a01_submissions",array('studentID','assignmentID','version','filePath'),array($studentID,$assignmentID,$version,addslashes($newpath)));
echo "File $filename sucessfully uploaded and stored at $newpath.\n";
}
else echo $moved . "<br/>\n";
}
else die("File cannot exceed 1MB");
}
else die("Bad file extension.");
}
else {
// HTML to display the submission screen
}
Однако моя проблема в том, что move_uploaded_file работает только для каталогов с разрешениями 777. При ближайшем рассмотрении выясняется, что это происходит потому, что PHP загружает данные как пользователь 'apache' и поэтому не может записывать в каталоги, принадлежащие моему имени пользователя, с помощью o-w. Я видел решения, опубликованные пользователями в документах PHP, которые предлагали использовать chown для восстановления файлов, но у меня недостаточно высокий уровень разрешений для этого. Есть ли элегантное решение этой проблемы, которое не предполагает попытки получения более высокого разрешения для моего имени пользователя?