いくつかの画像をディレクトリにアップロードするのが好きなアップロードスクリプトがあります。
私はこのコードを使用します:
$allowed_extension = array('jpg', 'jpeg', 'png', 'bmp', 'tiff', 'gif');
$errors = array();
$output = array();
if(!empty($_FILES['image']['tmp_name'])){
foreach($_FILES['image']['name'] as $key => $array_value){
if(!in_array(pathinfo($_FILES['image']['name'][$key], PATHINFO_EXTENSION), $allowed_extension)){
die("Die!");
}
}
foreach($_FILES['image']['name'] as $key => $array_value){
$file_name = $_FILES['image']['name'][$key];
$file_size = $_FILES['image']['size'][$key];
$file_tmp = $_FILES['image']['tmp_name'][$key];
$file_extension = pathinfo($file_name, PATHINFO_EXTENSION);
$file_extension = strtolower($file_extension);
if (!in_array($file_extension, $allowed_extension)){
$errors[$file_name][] = "format $file_extension in image $file_name is not accepted";
continue;
}
if ($file_size > 2097152){
$errors[$file_name][] = "maxsize of 2MB on $file_name has reached";
}
if (count($errors) == 0){
$dir = "a/b/c";
if (is_dir($dir)){
mkdir("a/b/c/tmp_images", 0755);
}else{
mkdir("a/b/c", 0755);
mkdir("a/b/c/tmp_images", 0755);
}
$path = "a/b/c/tmp_images";
$prifix = basename($file_name, "." . $file_extension);
//var_dump ($prifix);
$uploadfile = $path . "/" . $file_name;
$x = 0;
while (file_exists($uploadfile)){
$x ++;
$uploadfile = "{$path}/{$prifix}-{$x}.{$file_extension}";
}
if (move_uploaded_file($file_tmp, $uploadfile)){
$file_name = basename($uploadfile);
$output [$file_name] = "OK";
}else{
$output[$file_name] = "Failure while Uploading!";
$errors[$file_name][] = "Failure: Can't move uploaded pictures!";
}//else...
}//if(count($errors))...
}//foreach($_FILES['image']['name']...
}//if(!empty($_FILES['image']['tmp_name'])...
問題はその部分です:
if(!empty($_FILES['image']['tmp_name'])){
foreach($_FILES['image']['name'] as $key => $array_value){
if(!in_array(pathinfo($_FILES['image']['name'][$key], PATHINFO_EXTENSION), $allowed_extension)){
die("Die!");
}
}
2種類のファイルタイプをアップロードする場合、アップロードはキャンセルされます。これが私の最初の問題です。このような場合、フォームを投稿した後に作成したいファイルのために、アップロードをキャンセルする必要があります。そのため、ユーザーはフォームを投稿した後に変更を加えることはできません。2番目の部分を見てみましょう:
foreach($_FILES['image']['name'] as $key => $array_value){
$file_name = $_FILES['image']['name'][$key];
$file_size = $_FILES['image']['size'][$key];
$file_tmp = $_FILES['image']['tmp_name'][$key];
$file_extension = pathinfo($file_name, PATHINFO_EXTENSION);
$file_extension = strtolower($file_extension);
if (!in_array($file_extension, $allowed_extension)){
$errors[$file_name][] = "format $file_extension in image $file_name is not accepted";
continue;
}
if ($file_size > 2097152){
$errors[$file_name][] = "maxsize of 2MB on $file_name has reached";
...}
ここでは、エラーメッセージが表示されているはずであることが実際にアプローチされるべきであることがわかります。最初のforeach-partを残すと、2つの異なるファイルタイプの場合、1つのファイルがアップロードされ、もう1つのファイルではエラーメッセージが表示されるという問題が発生しました。
したがって、最初のforeachと2番目のforeachを組み合わせる方法があるはずです。正しい方法を教えてくれる人がいたら、本当にありがたいです。どうもありがとう。
アップデート
さて、遅れてすみません。ここに私のフィードバックがあります:このコードは、2つの異なるファイルタイプの場合にいくつかの問題があるようです。のようです
if (count($errors)>0){
die ("...")
}
実際には数えません。その場合、エラーメッセージが表示されます。
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to access a/b/c/tmp_images/abc.xls
ただし、拡張子が許可されている画像のアップロードも行いますが、他のファイルタイプが間違っているため、これは成功しません。問題は、これにより、ここに配置される挿入クエリが発生することです。
if (move_uploaded_file($fileTmp, $fileDst)) {
$output[$fileBase] = "OK";
**$insert = $db->query("INSERT INTO table ( a, b, c) VALUES('".$a."','".$b."','".$c."')");{
mkdir("a/b/c/d/e", 0755);
rename("a/b/c/tmp_images", "a/b/c/d/e/tmp_images");
$msg ="text abc.";
$to = "xxx@xxx.xx";
$subject = "xxx ";
$message = "text";
$headers = "From: xxx<xxx@xxx.xx>\r\n";
$headers .= "Content-type: text/plain; charset=UTF-8\r\n";
$mailheader .= "Return-Path: failuremail@" .$_SERVER['SERVER_NAME']. "\r\n";
$mailheader .= "MIME-Version: 1.0\r\n";
$mailheader .= "Content-Transfer-Encoding: 7bit\r\n";
$mailheader .= "Message-ID: <" .time(). " noreply@" .$_SERVER['SERVER_NAME']. ">\r\n";
$mailheader .= "X-Mailer: PHP v" .phpversion(). "\r\n\r\n";
mail($to, $subject, $message, $headers);
}//**
}else{
$output[$fileBase] = "Fehler beim Upload des Bildmaterials!";
$errors2[$fileBase][] = "Fehler: Die hochgeladenen Dateien können nicht verschoben werden!";
}//
}//
if (count($errors) > 0) {
die("Failurecode: ");
echo "$errors";
}...
そして、フォーミュラと同じページにある1次元配列からのエラーメッセージを取得するのと同じ方法で、2次元配列からエラーメッセージを取得するようにアプローチしたいと思います。「die」の場合、エラーを表示するために新しい空のページが開きます。どうもありがとう。