0

HTTP POSTリクエストでファイルがアップロードされるApacheサーバーがあります(<form enctype="multipart/form-data" action="upload.php" method="post">)。それは時々起こります(非常にまれですが、それでも起こります)、それでも私にはわからない理由で、ファイルがアップロードされた後、ディスク上のそのサイズは元のファイルのサイズと一致しません。

私がやりたいのは、ファイルを/tmpから最終的な宛先にコピーするPHPスクリプトから戻る前にこれらのエラーをキャッチすることです。$_FILES['uploadedfile']['size']私の最初のアイデアは、とを比較することでしたfilesize($target_path)。これは、2GBまでのファイルで正常に機能するようです。ただし、ファイルサイズのバイト数が32ビットを超えるとすぐに$_FILES['uploadedfile']['size']オーバーフローし、負になります。さらに、この値を「参照ファイルサイズ」として使用すると、アップロードプロセスで遅すぎる可能性があります(つまり、クライアントではなくサーバー上のファイルサイズです)。

からファイルサイズを抽出する可能性があります$_SERVER['CONTENT_LENGTH']が、この値にはリクエスト「メタデータ」と思われるものも含まれており、そのデータを実際のファイルサイズから分離する方法に関するドキュメントが見つかりませんでした(「メタデータ」サイズはリクエストから変更されます)リクエストする)

最も簡単な方法は、ソースのファイルサイズをリクエストパラメータとして投稿するようにクライアントに依頼することですが、クライアント側での変更はできるだけ少なくしたいと思います。

そもそも「HTTPPUT」で問題を防ぐことができると言われましたが、まだ調査の初期段階です。現在のPOSTメソッドで解決策を見つけたいのですが。

参考までに、アップロードスクリプトは次のようになります。

$id = strtolower($_POST["assetid"]);
$project = strtolower($_POST["project"]);
$target_path = Settings::getAssetPath($project,$id);

if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
    if (filesize($target_path) != $_FILES['uploadedfile']['size']){
        header("HTTP/1.0 500 Internal Server Error");
        $result .= "Uploaded file size does not match source file size!<br />";
    }
    else {
        header("HTTP/1.0 200 OK");
        $result .= "The file " . basename($_FILES['uploadedfile']['name']) . " has been uploaded successfully.";
    }
} else {
    header("HTTP/1.0 500 Internal Server Error");
    $result .= "There was an error uploading the file, please try again!<br />";
}

どんなアイデアでも大歓迎です!

4

1 に答える 1

2

アップロードスクリプトが正しくありません。['size']サーバーが受信したものです。何らかの理由でアップロードが中止/失敗した場合、['size'] 正しくありません。アップロードデータで何かを行う前に、アップロードが成功したかどうかを確認する必要があります。

if($_FILES['uploadedfile']['error'] !== UPLOAD_ERR_OK) {
   die("Upload failed with error code " . $_FILES['uploadedfile']['error']);
}

エラーコードはここで定義されています:http ://www.php.net/manual/en/features.file-upload.errors.php

于 2013-02-25T14:48:18.683 に答える