0

私はPHPにかなり慣れていないので(HTMLの経験もあまりありません)、質問があります。2つのPHPスクリプトで構成されるファイルアップロードシステムがあります(以下を参照)。ファイルアップロードフォームで、ユーザーはファイルを選択し、フォルダを保存してからアップロードします。保存場所は、アップロードディレクトリ内のフォルダで構成されるドロップダウンメニューから選択できます。ただし、ドロップダウンメニューには別のオプションがあります。ユーザーがオプションotherを選択すると、新しいフィールドが表示され(JavaScriptによって実行されます)、ユーザーは場所を手動で挿入できます(たとえば、ディレクトリが存在せず、ユーザーが新しいディレクトリを作成したい場合)。

ただし、ここに問題があります。ユーザーが事前定義されたフォルダーを選択した場合はすべて問題ありませんが、ユーザーがフィールドにディレクトリ名を書き込むと、呼び出されたフォルダーのみfolderが作成されます。たとえば、ユーザーが花に関する写真をアップロードしたいが、というフォルダーがflower存在しない場合、ユーザーはボックスを選択otherして書き込みflowerます。次に、アップロードボタンをクリックすると、基本的にPHPはという新しいフォルダflowerを作成し、そこに画像をアップロードする必要があります。しかし、現時点では、PHPはと呼ばれるフォルダーを作成しfolder、何らかの理由で画像がそこにアップロードされません(どこにもアップロードされません)。

スクリプトに関する私の問題:

  1. 新しいフォルダは作成されません。「folder」という2つの値があるためだと思いますが、「other」を選択した場合、PHPは最後の値のみを検索する方法がわかりません。
  2. フォルダを作成しても、何らかの理由でファイルがアップロードされません。

誰かが私の問題の解決策を見つけて、それを修正するのを手伝ってくれたら本当にありがたいです。そして、私の英語は上手ではなく、そのために理解できないことがあるので、遠慮なく追加情報を求めてください。

前もって感謝します!

1番目のファイルfile-upload.php::

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
<script language="JavaScript" type="text/javascript">
<!--

function Toggle(obj){
var val=obj.value;
if (!obj.m){ obj.m=''; }
if (!obj.m.match(val)){ obj.m+=','+val+','; }
var hide=obj.m.split(',');
for (var zxc0=0;zxc0<hide.length;zxc0++){
if (document.getElementById(hide[zxc0])){
document.getElementById(hide[zxc0]).style.display='none';
}
}
var show=val.split(',');
for (var zxc1=0;zxc1<show.length;zxc1++){
if (document.getElementById(show[zxc1])){
document.getElementById(show[zxc1]).style.display='';
}
}
}

//-->
</script>
</head>
<body>
<h1>Upload</h1>
<form action="upload.php" method="post"
enctype="multipart/form-data"><br>
<label for="file">File:</label>
<input type="file" name="file" id="file" /> 
    <br>
    Tüüp: <select name="folder" value="folder" onchange="Toggle(this);">
<?php  
foreach(glob('/uploadfolder/*',      GLOB_ONLYDIR) as $dir) 
{ 
    $dir = basename($dir); 
    echo '<option value="', $dir, '">', $dir, '</option>'; 
}  
?>
<option value="folder">other</option>
        </select><br> 

<input id="folder" value="Create a new folder" style="display:none;">
<input type="submit" name="submit" value="Upload" />
</form>
</body>
</html>

2番目のファイルupload.php::

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
</head>
<body>
<h1>Upload</h1>
<br>

<?php
$dirname  = $folder = $_POST["folder"];
$filename = "/uploadfolder/" . "$dirname" . "/";

if (!file_exists($filename)) {
    mkdir("/uploadfolder/" . "$dirname", 0777);
}

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "application/vnd.openxmlformats-     officedocument.spreadsheetml.sheet"))
&& ($_FILES["file"]["size"] < 5120000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Name: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Tmp. file: " . $_FILES["file"]["tmp_name"] . "<br />";
    echo "Folder: " . $folder . "<br />";

    if (file_exists("/uploadfolder/$folder/" . $_FILES["file"]["name"]))
      {
       echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "/uploadfolder/$folder/" . $_FILES["file"]["name"]);
      echo "Saved: " . "" . $_FILES["file"]["name"];
      }
     }
  }
else
  {
  echo "Upload failed";
  }
 ?>
</body>
</html>
4

3 に答える 3

0

現時点では、PHP は「folder」というフォルダーを作成しますが、何らかの理由で画像はそこにアップロードされません

これexit;は、2 番目のファイルからの次の抜粋にがあるためです。

<?php
$dirname = $_POST["folder"];
$filename = ("/uploadfolder/" . "$dirname" . "/");

if (!file_exists($filename)) {
    mkdir("/uploadfolder/" . "$dirname", 0777);
    exit;
} else {
}
?>

その結果、スクリプトはフォルダーが作成されるとすぐに終了します。

あなたのスクリプトには複数のセキュリティ上の問題がありますが、ここはセキュリティ レッスンの場所ではないため、それらについて詳しく説明するつもりはありません :)

于 2012-07-23T13:20:57.237 に答える
0

exitの後の行mkdirにより、スクリプトの実行が停止します。フォルダーを作成してからファイルのアップロードに進む場合は、exitステートメントを削除する必要があります。else空なので、その部分を削除することもできます...

$dirname  = $folder = $_POST["folder"];
$filename = "/uploadfolder/" . "$dirname" . "/";

if (!file_exists($filename)) {
    mkdir("/uploadfolder/" . "$dirname", 0777);
}

if ((($_FILES["file"]["type"] == "image/gif")
...
于 2012-07-23T13:21:21.987 に答える
0

次の手順を実行します

file-upload.php で、新しいフォルダー名のテキスト フィールドに name 属性を追加します。このようにしましょう、

<input id="folder" value="Create a new folder" name="newfolder" style="display:none;">

次に、upload.php ファイルを次のように変更します。

$dirname = $_POST["folder"];
$filename = ("./uploadfolder/" . "$dirname" . "/");
if($dirname=="folder"){$dirname=$_POST["newfolder"];}
if (!file_exists($filename)) {
    mkdir("./uploadfolder/" . "$dirname", 0777);
}

$dirname全体を通してフォルダ名として使用します。だから置き換え$folderます$dirname

もう 1 つは、アップロードがまだ正常に機能しない場合は、"./uploadfolder/$folder/"ベース パスとして使用することです。また、ワークスペースに 777 のアクセス許可を付与します。次のコマンドを使用できます。

chmod -R 777 <path_to_uploadfolder>

他のSOFユーザーが述べたようexit;に、最初にファイルの存在チェックから削除します。

あなたが答えを持っていることを願っています! :)

于 2012-07-23T14:01:39.733 に答える