0

PHPでファイル(pdf)をアップロードしたいのですが、

インターネットでコードを見つけ、ファイルのタイプを追加しただけです: application/pdf が、pdf ファイルでは機能しませんでした。(画像では問題なく動作します)。

htmlコード

<form action="upload_file.php" method="post"
 enctype="multipart/form-data">
 <label for="file">Filename:</label>
 <input type="file" name="file" id="file"><br>
  <input type="submit" name="submit" value="Submit">
  </form>

phpコード

$allowedExts = array("gif", "pdf", "GIF", "jpeg", "JPEG", "jpg", "JPG", "png", "PNG");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
     || ($_FILES["file"]["type"] == "application/pdf")
     || ($_FILES["file"]["type"] == "image/jpeg")
     || ($_FILES["file"]["type"] == "image/jpg")
     || ($_FILES["file"]["type"] == "image/pjpeg")
     || ($_FILES["file"]["type"] == "image/x-png")
     || ($_FILES["file"]["type"] == "image/png"))
    && ($_FILES["file"]["size"] < 90000000000) // increased allowed size may be your problem
    && in_array($extension, $allowedExts))
{
    if ($_FILES["file"]["error"] > 0)
    {
        echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    }
    else
    {
        echo "Upload: " . $_FILES["file"]["name"] . "<br>";
        echo "Type: " . $_FILES["file"]["type"] . "<br>";
        echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
        echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

        if (file_exists("upload/" . $_FILES["file"]["name"]))
        {
            echo $_FILES["file"]["name"] . " already exists. ";
        }
        else
        {
            move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
            echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
        }
    }
}
else
{
    echo "Invalid file";
}

エラーは

Invalid file

*

アップデート

*

var_dump($_FILES['file']); スクリプトの先頭に追加した後

クロム(正常に動作します)では、出力は次のとおりです。

array
  'name' => string 'Nouveau Document Microsoft Office Word.pdf' (length=42)
  'type' => string 'application/pdf' (length=15)
  'tmp_name' => string 'C:\wamp\tmp\php58AD.tmp' (length=23)
  'error' => int 0
  'size' => int 79770
Upload: Nouveau Document Microsoft Office Word.pdf
Type: application/pdf
Size: 77.900390625 kB
Temp file: C:\wamp\tmp\php58AD.tmp

firfoxでは、出力は機能しませんでした

array
  'name' => string 'Nouveau Document Microsoft Office Word.pdf' (length=42)
  'type' => string 'application/force-download' (length=26)
  'tmp_name' => string 'C:\wamp\tmp\phpBEFD.tmp' (length=23)
  'error' => int 0
  'size' => int 79770

string 'application/force-download' (length=26)

Update2

*$_FILES["file"]["type"]を除いたコード*

     var_dump($_FILES["file"]["type"]);
     $allowedExts = array("gif","pdf", "GIF");
     $extension = end(explode(".", $_FILES["file"]["name"]));

     in_array($extension, $allowedExts);


   echo "Upload: " . $_FILES["file"]["name"] . "<br>";
   echo "Type: " . $_FILES["file"]["type"] . "<br>";
   echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
   echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";


       move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
    echo "Stored in: " . "upload/" . $_FILES["file"]["name"];

すべてのブラウザーで問題なく動作しましたが、ファイルの種類とサイズをテストする必要があります。そして何が問題だったのですか?

4

1 に答える 1

2

ファイルの MIME タイプはクライアントによって送信され、サーバーによって検出されないことに注意してください。したがって、簡単にだまされる可能性があります。

それをチェックしてはいけません。それに関するチェックをすべて外し、ファイル拡張子だけをチェックしてください。

この行を変更することができます:

 $extension = end(explode(".", $_FILES["file"]["name"]));

それと :

$extension = strtolower(end(explode(".", $_FILES["file"]["name"])));

そして、小文字の拡張子だけで配列を変更してください。

于 2013-05-23T15:28:58.210 に答える