そのため、一度に複数のファイルをアップロードしようとしていますが、実行するたびに、実行しようとするファイルのアップロードごとにループ内の最後のファイルのみをアップロードしています。最終的に、データベース内の複数のポイントが参照しているのは、1 つのファイルのみをサーバーにアップロードすることです。
独立した関数と変数を使用して、ループの外側でファイルのアップロード関数を実行しようとしましたが、まだ実行中です。
私のコード:
<?php $image_number = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$image_allowed = array('jpg', 'jpeg', 'gif', 'png');
if (empty($errors) === true) {
foreach ($image_number as $value) {
if (isset($_FILES['story_image_' . $value]) === true) {
if (empty($_FILES['story_image_' . $value]['name']) === false) {
if (in_array(strtolower(end(explode('.', $_FILES['story_image_' . $value]['name']))), $image_allowed) === false) {
$errors[] = 'Incorrect file type for \'Story image ' . $value . '\'. Allowed file types: ' . implode(', ', $image_allowed);
} else if ($_FILES['story_image_' . $value]['size'] > 1048576) {
$errors[] = 'Story image ' . $value . '\'s file size may not exceed 1 MB, or 1048576 Bytes.';
}
}
}
}
}
foreach ($image_number as $value) {
if ($_POST['removeImage' . $value] === 'on') {
remove_story_image($story_data['story_id'], $value, $story_data['story_image_' . $value]);
} else {
if (isset($_FILES['story_image_' . $value]) === true) {
if (empty($_FILES['story_image_' . $value]['name']) === false) {
$file_path = '/cdsite/images/storyimages/' . substr(md5(time()), 0, 10) . '.' . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name'])));
$movefile_path = $_SERVER['DOCUMENT_ROOT']."/cdsite/images/storyimages/" . substr(md5(time()), 0, 10) . "." . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name'])));
move_uploaded_file($_FILES['story_image_' . $value]['tmp_name'], $movefile_path);
mysql_query("UPDATE `stories` SET `story_image_" . $value . "` = '" . mysql_real_escape_string($file_path) . "' WHERE `story_id` = " . $story_data['story_id']);
}
}
}
}
?>
フォームと、個別に名前が付けられ、一致するすべてのファイル フィールドの名前を確認しました。エラーの最初のループ チェックは問題なく機能するため、これは構文の問題ではありません。ファイルをアップロードしようとしたときにのみ、上書きが開始されます。
誰でも私を啓発できますか?(私はかなりの初心者なので、初心者の話に留めておいてください)
** * ** 更新 * ** * ** * ****
だから私は今問題を解決しました.以下は作業コードです:
foreach ($image_number as $value) {
if ($_POST['removeImage' . $value] === 'on') {
remove_story_image($story_data['story_id'], $value, $story_data['story_image_' . $value]);
} else {
if (isset($_FILES['story_image_' . $value]) === true) {
if (empty($_FILES['story_image_' . $value]['name']) === false) {
$file_path = '/cdsite/images/storyimages/' . substr(md5(time()), 0, 10) . '.' . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name'])));
$movefile_path = $_SERVER['DOCUMENT_ROOT']."/cdsite/images/storyimages/" . substr(md5(time()), 0, 10) . "." . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name'])));
if (file_exists($movefile_path) === true) {
$file_path = '/cdsite/images/storyimages/' . substr(md5(time()), 0, 10) . substr(md5(rand()),0,10) . '.' . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name'])));
$movefile_path = $_SERVER['DOCUMENT_ROOT'].$file_path;
}
move_uploaded_file($_FILES['story_image_' . $value]['tmp_name'], $movefile_path);
mysql_query("UPDATE `stories` SET `story_image_" . $value . "` = '" . mysql_real_escape_string($file_path) . "' WHERE `story_id` = " . $story_data['story_id']);
}
}
}
}
将来同様の問題に遭遇する可能性があり、簡単な説明が必要な人のために、他の人が提供してくれたときに感謝することがよくあります.
問題は、ループを反復処理しているときに同時に md5 ハッシュを実行し、次のコード行で同じファイル名を書き換えていたことです。
$movefile_path = $_SERVER['DOCUMENT_ROOT']."/cdsite/images/storyimages/" . substr(md5(time()), 0, 10) . "." . strtolower(end(explode('.', $_FILES['story_image_' . $value]['name'])));
お気づきのように、2 つのファイル パスがあります。これは誰も混乱させるためではなく、html が後で参照できるデータベースへの絶対パス ($file_path) をアップロードし、php がファイルをアップロードするために使用できる絶対パス ($movefile_path) を取得できるようにするためです。
問題を解決するために、ファイルが既に存在するかどうかを確認するループ チェックを行い、存在する場合は、md5 ハッシュされたタイムスタンプに続いて md5 ハッシュされたランダムな文字列を追加して、新しい一意のファイル名を作成しました。$movefile_path ファイル パスを使用して、ファイルが存在するかどうかを確認しました。これは、php が使用できるパスだからです。
また、更新された $file_path 変数を更新された $movefile_path に含めるようにしました。そうしないと、ランダムな文字列を再ハッシュすると、php がアップロードした実際のファイル名とは異なる、データベースから参照する html のファイル名が得られてしまいます。