1

そのため、一度に複数のファイルをアップロードしようとしていますが、実行するたびに、実行しようとするファイルのアップロードごとにループ内の最後のファイルのみをアップロードしています。最終的に、データベース内の複数のポイントが参照しているのは、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 のファイル名が得られてしまいます。

4

1 に答える 1

1

アップロードしているファイルの名前を変更する必要があります。ユーザー入力を信頼しないでください...画像名の後ろにUNIXタイムスタンプまたは一意のIDを付けることができます

于 2013-05-17T17:09:35.247 に答える