2

ファイルをアップロードするためのPHPスクリプトを作成しました。しかし、送信ボタンを押すと、エラーメッセージが表示されます。

Strict Standards: Only variables should be passed by reference in H:\xampp\htdocs\phpTest\upload_file.php on line 4.

4行目は$extension= end(explode( "。"、$ _FILES ["file"] ["name"]));です。

upload_file.php:

<?php

$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Error: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {

$target_Path = "images/";
$target_Path = $target_Path.basename( $_FILES['file']['name'] );
move_uploaded_file( $_FILES['file']['tmp_name'], $target_Path );


  echo "Upload: " . $_FILES["file"]["name"] . "<br />";
  echo "Type: " . $_FILES["file"]["type"] . "<br />";
  echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
  echo "Stored in: " . $_FILES["file"]["tmp_name"];
  echo $target_Path;
  }
  }
  else
  {
  echo "Invalid file";
  }
?> 
4

3 に答える 3

6

end()その関数呼び出しのコンテキスト内にのみ存在する配列に対して実行しようとしています。そのコード行が完了すると、配列は存在しなくなります。代わりにこれを試してください:

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

そうは言っても、これはファイル拡張子を抽出する方法としては不十分であり、非常に安全でもありません. $_FILES 配列で提供されるファイル名は、リモート クライアントによって指定されたファイル名です。そのファイル名を偽造することは簡単ではなく、ユーザーが「nastyvirus.exe」をアップロードして「cutekittens.jpg」をファイル名として送信できるようにします。

特にファイルのアップロードについては、ユーザー側のデータを決して信頼しないでください。fileinfoを介してサーバー側の MIME タイプの決定を使用する

于 2012-08-06T04:47:45.350 に答える
3

マニュアルによると、http://www.php.net/end

この配列は関数によって変更されるため、参照によって渡されます。これは、実際の変数のみが参照によって渡される可能性があるため、配列を返す関数ではなく、実際の変数を渡す必要があることを意味します。

したがって、爆発結果を変数に割り当ててから、その変数に end() を割り当てる必要があります

于 2012-08-06T04:47:02.003 に答える
0

終了機能だけで問題が発生した場合は、次のようにしてファイルの拡張子を取得できます。

$path_parts = pathinfo($fullPath);
$extension = strtolower($path_parts["extension"]); 
于 2012-08-06T05:47:44.523 に答える