LoginSignup
2
2

More than 3 years have passed since last update.

画像をアップロードする方法(PHP)

Last updated at Posted at 2019-07-12

はじめに

こんにちは。こんばんは。
ワタタクです。
今回は画像のアップロードについてです。
最近のWEB開発においては画像処理は必須でしょう?ってことで書いていきます。
言語はPHPで書いていきます。

アップロードフォーム作成

フォームには必ず、enctype=”multipart/form-data”を設定してください。
また、methodがPOSTでなくてはならないという点にも注意する必要があります。

<form action="file_up.php" enctype="multipart/form-data" method="post">
    <input name="file_upload" type="file" />
    <input type="submit" value="アップロード" />
</form>

ファイルの受け取り

ここからPHPのお話。
ファイルを受け取るときは$_FILES[]を使います。
$_FILESは連想配列で以下のような形式になっています。

$_FILES[アップロードフォームのname(file_upload)][アップロードされたファイルの情報]

アップロードされたファイルの情報として、以下の5つの項目があります。

  • name
    元のファイル名

  • tmp_name
    サーバーに一時保存されたファイル名

  • error
    エラー内容

  • type
    ファイルタイプ

  • size
    ファイルサイズ
    例えば、今回の場合でエラー内容を確認する場合は、$_FILES[‘file_upload’][‘error’]と指定できます。

move_uploaded_file()を使う

クライアントからのリクエストでアップロードされたファイルの保存場所を変更する際に使用するのがmove_uploaded_file関数です。
アップロードされたファイルはまず、/tmpなどの一時フォルダに保存されます。

そのままでは、一定の時間が経つと一時フォルダの中身は削除されるので、アップロードされたファイルを今後使用する場合は
勝手に削除される可能性がない専用のディレクトリに保存する必要がありるため、その際にmove_uploaded_file関数を利用します。

move_uploaded_fileの書き方

第一引数には移動前のパスを指定する必要があります。

基本は$_FILES[‘項目名’][‘tmp_name’]を指定します。

「項目名」とファイルを選択した際のinputタグ内でname属性に指定された値です。

$_FILES[‘項目名’]でそのファイルの情報という意味で、[‘tmp_name’]は一時フォルダに保存されているそのファイルまでのパスです。

第二引数では移動先のパスを指定します。

ファイル名までを含めたフルパスを指定する必要があるので、既存のファイル名と重複しないように気をつけましょう。
基本的に上記のことをするとアップロードできます。

エラー処理

if(!is_uploaded_file($fileArray["tmp_name"])) {
    echo 'ファイルが指定されていないか、ファイルアップロードに失敗しました。';
}
elseif($fileArray["type"] != 'image/png' && $fileArray["type"] != 'image/jpeg' && $fileArray["type"] != 'image/jpg') {
    echo'対応できない画像ファイルが指定されました。JPEGまたはPNG画像ファイルを指定してください。';
}

サムネイル作成

これだけではおもしろくないのでTIPSという形でサムネイルの作成の方法も載せておきます。

getimagesizeを使う。

getimagesize()は指定した画像ファイルの大きさに関する情報を配列として取得します。

[引数]
画像サイズを取得するファイル名を指定します。 
[返り値]
取得した画像のサイズ・形式などの4つの要素からなる配列で返します。
0:幅
1:高さ
2:画像種類 (gif=1 jpg=2 png=3)
3:高さ="" 幅=""
bits:ビット/ピクセル
channels:チャンネル
mime:MIMEタイプ

サンプルコード

$imgSizeArray = getimagesize($fileArray["tmp_name"]);
$width = $imgSizeArray[0];
$height = $imgSizeArray[1];
$imgType = $imgSizeArray[2];

//このような書き方でも同じ意味
list($width, $height, $imgType) = getimagesize($fileArray["tmp_name"]);

imagecreatefromgif,imagecreatefrompng,imagecreatefromjpegを使う

imagecreatefromgif($filename)
imagecreatefrompng($filename)
imagecreatefromjpeg($filename)は指定したファイル・URL をメモリ上の画像リソースに確保する関数

[引数]
$filename 
JPEG/PNG画像ファイルを指定します。 
[返り値]
成功した画像リソースの ID を、その他の場合は false を返します。

サンプルコード

if($imgType == 3) {
    $image = imagecreatefrompng($fileArray['tmp_name']);
} else {
    $image = imagecreatefromjpeg($fileArray['tmp_name']);
}

imagecreatetruecolorを使う

imagecreatetruecolor($width, $height)はTrueColor イメージを新規に作成する(黒いキャンバスを作るイメージ)

[引数]
$width 
作成するサムネイルの横幅を指定します。 
$height 
作成するサムネイルの高さを指定します。 
[返り値]
画像の作成に成功した場合はリソースIDを、失敗した場合は falseを返します。

サンプルコード

$newHeightS = 60;
$rateX = $height / $newHeightS;

$newWidthS = $width / $rateX;

$canvasS = imagecreatetruecolor($newWidthS, $newHeightS);

imagecopyresampledを使う

imagecopyresampled()は再サンプリングを行いイメージの一部をコピー、伸縮する

[引数]
dst_im
コピー先の画像リンクリソース。 
src_im
コピー元の画像リンクリソース。 
dst_x
コピー先の x 座標。 
dst_y
コピー先の y 座標。 
src_x
コピー元の x 座標。 
src_y
コピー元の y 座標。 
dst_w
コピー先の幅。 
dst_h
コピー先の高さ。 
src_w
コピー元の幅。 
src_h
コピー元の高さ。

[返り値]
成功した場合に TRUE を、失敗した場合に FALSE を返します。 

サンプルコード

imagecopyresampled($canvasS, $image, 0, 0, 0, 0, $newWidthS, $newHeightS, $width, $height);

imagegif,imagejpeg,imagepngを使う

imagegif($image, $filename, $quality)
imagejpeg($image, $filename, $quality)
imagepng($image, $filename, $quality)は画像リソースをブラウザーに直接出力、あるいは画像ファイルに出力(作成)する関数

[引数]
$image 
画像リソースを指定します。 
$filename 
画像リソースをファイルに保存する場合、ファイル名を指定します。 
$quality 
画像のクオリティを0(低品質)から100(高品質)で指定します。デフォルトは75です。 
[返り値]
画像の出力・作成に成功した場合は trueを、その他の場合は flaseを返します。 

サンプルコード

imagejpeg($canvasS, $upDir.$phPathS, 100);

imagedestroy使う

imagedestroy()は画像を保持するメモリを解放します

サンプルコード

imagedestroy($canvasS);

imagedestroy($image);

最後に

サムネイルが似たような関数ばっか使って作るのでややこいですね。

もし、何か間違い等がございましたらご連絡下さい。
最後まで読んでいただきありがとうございます。
次回はPHPExcelあたりでもいじりますかね?

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2