0

これを読んでくれてありがとう。顧客が各製品の 35 枚の写真をアップロードするための CMS の一部として、35 個のファイル入力ボックスを備えたフォームがあります。その内訳は、各商品の黒バージョンが7枚、青バージョンが7枚、グレーが7枚、赤バージョンが7枚、白バージョンが7枚です。つまり、彼がアップロードする必要がある合計 35 枚の写真です。さらに、アップロードするファイルごとに、小さい「サムネイル」サイズの画像を作成する必要があります。私がいつも使用しているファイル アップロード スクリプトは、アップロードするファイルが 1 つだけの場合にうまく機能します。この場合、35個のファイルに適用する方法がわかりません。各入力ボックスには一意の名前 (black1、black2...black7、blue1、blue2...blue7 など) があるため、技術的には、これを行うために各ファイル入力ボックスの一意の名前でアップロード コードを 35 回繰り返すことができますが、それは明らかに非常に非効率的です。ここの誰かがより良い解決策を手伝ってくれることを願っています。

追加の要件は、ファイルの名前がデータベースに格納されていることです。黒い写真のすべてのファイル名は、コンマで区切られた文字列に入れられblackpics、データベースの列に保存されます。青い画像のすべてのファイル名は、コンマで区切られた文字列に入れられbluepics、データベースの列に保存されます。灰色、赤、白の写真についても同様です。

これは、1 つのファイルをアップロードするためのコードです。入力ボックス「file」からファイルを取得し、正しい拡張子 (画像ファイル) であることを確認し、ファイルサイズを確認し、乱数とタイムスタンプを使用してランダムなファイル名を作成し、サムネイル (448px x 298px - 大きなサムネイル) を作成します。 、私は知っています)、アップロードされた元の画像が正しいサイズ (873px x 581px) であることを確認し、すべて問題がなければ、大きなファイルが ../images/store/big/ に保存され、親指が保存されます。 ../images/store/small/ にあります。どちらも同じファイル名を持ち、異なるディレクトリに保存されているだけです。一時ファイルはすべて削除され、エラーがあればファイルは削除されます。私が言ったように、これは1つのファイルに対してうまく機能します。

したがって、入力ボックス「black1」、「black2」...「black7」に対してこれらすべてを実行するようにコードを変更し、すべてのファイル名を文字列 (black1.jpg、black2.jpg) に保存する必要があります。 ,black3.jpg,black4.jpg,black5.jpg,black6.jpg,black7.jpg) をデータベースの「blackpics」列に保存できます。ブルー、グレー、レッド、ホワイトも同様です。データベースの部分については、助けは必要ありません。ファイル名を返すファイル アップロード スクリプトを含む関数を作成する必要があると考えています。次に、その関数を 35 回 (入力ボックスごとに 1 回) 呼び出します。しかし、私は間違っている可能性があります。

誰かが私に何か助けを提供できるなら、私はそれを大いに感謝します. アップロード スクリプトのコードは次のとおりです。

<?php

 $filename = $_FILES["file"]["name"];
 $file_basename = substr($filename, 0, strripos($filename, '.')); // get file extention
 $file_ext = substr($filename, strripos($filename, '.')); // get file name
 $filesize = $_FILES["file"]["size"];
 $allowed_file_types = array('.jpg','.gif','.png', '.JPG');

   if (in_array($file_ext,$allowed_file_types)  &&  ($filesize < 1024000)) {
      // rename file
        $rand = rand(1,100000000);
        $time = time();
        $newfilename = $rand . $time . $file_ext;
            if (file_exists("../images/store/big/" . $newfilename)) {        
            // file already exists error
                $err[] =  "You have already uploaded this file.";            
            } else {        
                move_uploaded_file($_FILES["file"]["tmp_name"], "../images/store/big/" . $newfilename);
                $pathToImage = '../images/store/big/' . $newfilename;
                $pathToThumb = '../images/store/small/' . $newfilename;
                $last4 = substr($pathToImage, -4);

                switch(strtolower($last4)) {
                  case '.jpeg':
                    $img = imagecreatefromjpeg($pathToImage);
                    break;
                  case '.jpg':
                    $img = imagecreatefromjpeg($pathToImage);
                    break;
                  case '.png':
                    $img = imagecreatefrompng($pathToImage);
                    break;
                  case '.gif':
                    $img = imagecreatefromgif($pathToImage);
                    break;
                  default:
                    exit('Unsupported type: '. $pathToImage);
                }

                $max_width = 448;
                $max_height = 298;

                // Get current dimensions
                $old_width  = imagesx($img);
                $old_height = imagesy($img);

                // Calculate the scaling we need to do to fit the image inside our frame
                $scale = min($max_width/$old_width, $max_height/$old_height);

                // Get the new dimensions
                $new_width  = ceil($scale*$old_width);
                $new_height = ceil($scale*$old_height);

                $tmp_img = imagecreatetruecolor($new_width, $new_height);
                imagecopyresampled($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $old_width, $old_height);

                switch(strtolower($last4)) {
                  case '.jpeg':
                    imagejpeg($tmp_img, $pathToThumb);
                    break;
                case '.jpg':
                    imagejpeg($tmp_img, $pathToThumb);
                    break;
                case '.png':
                    imagepng($tmp_img, $pathToThumb);
                    break;
                case '.gif':
                    imagegif($tmp_img, $pathToThumb);
                    break;
                default:
                    exit('Unsupported type: '. $pathToImage);
                }
                imagedestroy($tmp_img);
                imagedestroy($img);
              }
           } elseif (empty($file_basename)) {    
            $err[] =  "Select a file to upload";
        } elseif ($filesize > 1024000) {    
            $err[] =  "File size limit exceeded";
        } else {    
            $err[] =  "File type not allowed";
            unlink($_FILES["file"]["tmp_name"]);
        }

        list($width, $height) = getimagesize("../images/store/big/$newfilename");
        if ($width != "873" || $height != "581") {
           $err[] = "File dimensions error";
           unlink("../images/store/big/$newfilename");
           unlink("../images/store/small/$newfilename");
         }
 ?>

そして、本文にはファイルアップロードフィールドがあります...

<input type="file" name="black1" disabled="1">
<input type="file" name="black2" disabled="1">
...
<input type="file" name="black7" disabled="1">

<input type="file" name="blue1" disabled="1">
<input type="file" name="blue2" disabled="1">
...
<input type="file" name="blue7" disabled="1">

灰色、赤、白の場合も同様です。

私が言ったように、誰かが私を助けることができれば、私はそれを大いに感謝します. ここまで読んでくれてありがとう。

4

1 に答える 1

1

まず、画像に寸法を使用しないでください。寸法は、画像のサイズについてはあまり言いません。また、ウェブサイトに画像を表示するには、寸法ではなくサイズが重要です。

次に、マルチパート アップロード フォームを使用してみませんか? ここを参照してください。そして、クライアントは画像を色分けして選択し、1 回の選択でアップロードできます。これにより、クリック数が 35 回から 7 回に減少します。または、クライアントがより技術に精通していると信頼している場合: 入力フィールドを 1 つだけ使用し、特定の方法でファイルに名前を付けるように指示します。黒い画像なら「b_[ファイル名].[拡張子]」のように。次に、お気に入りの文字列検索方法 (RegEx など) を使用して、画像クラスを識別します。

于 2013-05-06T08:12:15.833 に答える