私は、共同で教えているコースの成績とドキュメントのために、Linux Web サーバー上で PHP Web アプリに取り組んでいます。私が今書いているページは、学生がドロップダウン メニューから課題を選択し、課題をアップロードして提出する、課題提出用のページです。送信時に、送信に関するすべての情報が MySQL テーブルに入れられ、ファイルはファイル システム上の永続的な場所に移動されます。理想的には、これは課題、学生、およびバージョンごとに高度に整理されたものですが、私が今欲しいのは、原則としてファイルのアップロードを機能させることだけなので、今のところディレクトリ ~/phptest/ (アクセス許可は 755 に設定されていますが、テスト用に 777 を試してみましたが、どちらもうまくいきませんでした)。現在のコードは次のとおりです。
($dbh は、これらの特定の DB トランザクションをよりクリーンにするために作成した拡張 DB ハンドル クラスのインスタンスです)
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 . "
\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' として何かをアップロードしているためであることが明らかになりました。chown を使用してファイルを再利用することを提案する PHP ドキュメントでユーザーが投稿したソリューションを見ましたが、これを行うのに十分な権限レベルがありません。ユーザー名の上位のアクセス許可を取得しようとすることを伴わない、この問題に対するエレガントな解決策はありますか?