昨日はファイルのアップロードにあまり注意を払わなかったのですが、簡単なアップロードを行ったのですが、かなりの問題があることがわかりました。
冒頭のプログラムコードは以下の通りです。
アップロードimg.php
<?php
//アップロードインターフェイスか実装インターフェイスかを判断し、アップロードインターフェイスの場合は次のHTMLページを表示します。
if(!$_POST['UploadAction']):
?>
<html>
<頭>
<タイトル></タイトル>
</head>
<本文><表><中央>
<form enctype="multipart/form-data" name="SubmitForm" action="" method="post">
<input type="hidden" name="UploadAction" value="1">
<tr><td><input name="UploadFile" type="file" size="30"></td></tr>
<tr><td><input type="submit" name="submit" value="アップロード"></td>
<td><input type="reset" name="reset" value="リセット"></td></tr>
</form>
</center></table></body>
</html>
<?php
//実装ページの場合は、以下のHTMLページを表示し、PHPスクリプトを起動します
それ以外の場合:
?>
<html>
<頭>
<タイトル></タイトル>
</head>
<本文>
<?php
//www.knowsky.com は UploadAction のステータスを初期化します
$UploadAction=0;
$UploadFile=$_POST['UploadFile']
if(($UploadFile!="none") && ($UploadFile!="");
{
$UploadPath=$_SERVER['DOCUMENT_ROOT']."\"
if (!is_writeable($UploadPath))
{
echo "$UploadPath ディレクトリは書き込み可能ではありません!"; exit;
}
それ以外
{
echo "$UploadPath ディレクトリは書き込み可能です!";
$FileName=$UploadFile_name
if($UploadFile_size<1024)
;
{
$FileSize=(文字列)$UploadFile_size."バイト";
}
elseif($UploadFile_size<(1024*1024))
{
$FileSize=number_format((double)($UploadFile_size/1024),1)."KB";
}
それ以外
{
$FileSize=number_format((double)($UploadFile_size/(1024*1024)),1)."KB";
}
if(!file_exists($UploadPath.$FileName))
{
if(move_uploaded_file($UploadFile,$UploadPath.$FileName))
{
echo "ファイル $UploadFile_name ($FileSize) が正常にアップロードされました!";
}
それ以外
{
echo "ファイル $UploadFile_name ($FileSize) のアップロードに失敗しました!";
}
unlink($UploadPath.$FileName);
}
それ以外
{
echo "ファイル $UploadFile_name はすでに存在します!";
}
}
それ以外
{
echo "アップロードするファイルが選択されていないか、アップロードされたファイルが $MAX_FILE_SIZE を超えています!";
}
?>
<br><a href="uploadimg.php">戻る</a>
</body>
</html>
<?php
endif
?>
実行してみると、アップロードはまったく効果がないことがわかり、実装ページにさえ入ることができませんでした。検索して尋ねたところ、アップロードされたファイルを取得するには $_FILES が必要であることがわかった
ので、いくつかの変更を加えました。
$UploadFile=$_FILES['UploadFile']['tmp_name'];
$UploadFile_size=$_FILES['アップロードファイル']['サイズ'];
$UploadFile_name=$_FILES['アップロードファイル']['名前'];
$FileName=strto lower($UploadFile_name);
これで完了かと思いましたが、次のようなエラーメッセージが表示されました。
警告: move_uploaded_file(F:Serverwww): ストリームを開けませんでした: F:Serverwwweooolfinishuploadimg.php の 76 行目でアクセス許可が拒否されました
警告: move_uploaded_file(): 76 行目の F:Serverwwweooolfinishuploadimg.php の 'E:WINDOWSTEMPphp34.tmp' を 'F:\Server\www' に移動できません
ファイル *****(**** バイト) のアップロードに失敗しました!
WIN システムでデバッグしていたので、ファイルのアクセス権に問題があるはずはありません。いろいろ考えましたが、それでもわかりませんでした。Lao Lao と Joy にメッセージを投稿しました。しかし、単純なファイルのアップロードに 1 日以上かかりましたが、それでも完了できず、インターネット上で同様のエラーを見つけることができず、非常にイライラしました。
結局、sablog でデバッグするときに、なぜ添付ファイルを正常にアップロードできるのかを考えるしかありませんでした。そこで、添付ファイルを sablog にアップロードするための元のコードを注意深く確認し、コードに基づいて次の変更を加えました。
関数 getextension($filename) {
return substr(strrchr($filename, "."), 1);
$extension=getextension($FileName);
if
(move_uploaded_file($UploadFile,$UploadPath."temp.".$extension))
//unlink($UploadFile);
unlink($UploadPath."temp.".$extension);
結果はすぐに届き、アップロードは成功しました。
ここでは unlink($UploadPath."temp.".$extension); を使用して、スペースにアップロードされたファイルをすぐに削除してスペースを節約します。