1)ファイルのアップロード
ファイル入力に配列構文を使用する場合、ファイルインデックスが最後のキーになります。 $_FILES["file"]["name"]
たとえば、はファイル名の配列です。 i番目のファイルの情報を取得するには、$_FILES["file"]["name"][$i]
にアクセスする必要があります。 、$_FILES["file"]["size"][$i]
&c。
2)画像をフォルダに保存する
$_FILES
のデータの一部 (名前など)はクライアントからのものであるため、信頼されません(つまり、最初に確認します)。 ファイル名
の場合 、 realpath
を使用して開始できます。
ターゲットファイルのパス名が安全であることを確認するには、または basename
を使用します
またはpathinfo
ターゲットパス名をアセンブルする前に、指定された名前の最後のコンポーネントを抽出します。
3)画像情報をDBに保存する
指定する(不完全な)データベーススキーマは、各画像に同じテーブルの2つの列を指定するように見えます。リレーショナルモデルでは、to-manyリレーションシップは別のテーブルでモデル化されます:
CREATE TABLE images (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
`path` VARCHAR(256) NOT NULL,
`description` TEXT,
`member` INT UNSIGNED NOT NULL,
FOREIGN KEY `member` REFERENCES members (`id`) ON DELETE CASCADE ON UPDATE CASCADE -- the image's owner
) Engine=InnoDB;
-- Note: this is a many-to-many relationship
CREATE TABLE ad_images (
`ad` INT UNSIGNED NOT NULL,
`image` INT UNSIGNED NOT NULL,
FOREIGN KEY `ad` REFERENCES ads (`ad_id`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY `image` REFERENCES images (id) ON DELETE CASCADE ON UPDATE CASCADE,
UNIQUE KEY (`ad`, `image`)
) Engine=InnoDB;
それ以外の場合は、zero-one-infinity を破っています。 画像の最大数より少ない場合のルールと無駄なスペース。
その他
ファイル記述フィールドに配列構文を使用して、それらの処理を容易にすることができることに注意してください。それらに「filedesc[]」という名前を付けます。
長い一連の比較ではなく、配列ルックアップまたはパターンマッチを使用します。
function isImage($type) {
static $imageTypes = array(
'image/gif'=>1, 'image/jpeg'=>1, 'image/pjpeg'=>1, 'image/png'=>1,
);
return isset($imageTypes[$type]);
/* OR */
return preg_match('%^image/(?:p?jpeg|gif|png)%', $type);
/* OR allow all images */
return preg_match('%^image/%', $type);
}
if (isImage($_FILES["file"]["type"][$idx]) && ($_FILES["file"]["size"][$idx] < 1048600)) {
ファイルタイプは、クライアントが提供する値の1つです。より安全なのは、 fileinfo
を使用することです。
画像タイプを取得します。
$finfo = finfo_open(FILEINFO_MIME_TYPE);
if (isImage(finfo_file($finfo, $path)) && ($_FILES["file"]["size"][$idx] < 1048600)) {
ファイルに有効な画像ヘッダーがあり、残りが有効でない場合は、それでもだまされる可能性があります。 画像ライブラリ を使用できます (GDやImageMagickなど)ファイルを画像として正常に開くことができるかどうかを確認して、ファイルを検証します。