質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

5349閲覧

画像をアップロードするときに画像ファイルを選択して送信したのに、画像が選択されていないと表示される。

Kuriaki

総合スコア85

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/01/17 08:39

画像ファイルによってその結果がちがいます。
小さいデータでアップすると普通に送信完了とでますが、4Mまたは5Mのファイルであげると、私が書いたエラー文が出てきます。

書いたとおりに、if ($_FILES['upfile']['size'] === 0) {
echo '<FONT COLOR="RED">ファイルを選択して下さい!</FONT>';
} else {
echo '送信完了';

4Mや5M以上の画像ファイルをアップするときに、このエラーチェックに通れなくて、ファイルを選択してくださいと表示します。
また、小さい画像ファイルですと、エラーではなく、送信完了と出てきます。
php.iniの方も5Mまであげてますので、それを超えるとほかのエラー文が出るはずなのに、なぜファイルが選択されてないと判定したですか?
どうしてこうなりますか?
回答よろしくお願いいたします。

html

1<!DOCTYPE html> 2<html> 3<head> 4 5 <meta charset="utf-8"> 6 <title>php</title> 7</head> 8<body> 9<form action="resize.php" method="post" name="form" enctype="multipart/form-data"> 10 11 12<input type="hidden" name="MAX_FILE_SIZE" value="524288"> 13<p> 14<input type="file" name="upfile" size="30" id="upload"> 15</p> 16 17<p> 18<input type="submit" value="送信する"> 19</p> 20</form> 21</body> 22 </html>

php

1<?php 2$file = $_FILES['upfile']; 3$tmp_name = $file['tmp_name']; // 一時ファイルのパス 4if ($_FILES['upfile']['size'] === 0) { 5 echo '<FONT COLOR="RED">ファイルを選択して下さい!</FONT>'; 6} else { 7 echo '送信完了'; 8 9 $get = getimagesize($tmp_name); 10 if ($get["0"] > 1000) { 11 echo '<FONT COLOR="RED">横幅を小さくしてください!</FONT>'; 12 } else { 13 echo ""; 14 } 15 if ($get["1"] > 1000) { 16 echo '<FONT COLOR="RED">縦幅を小さくしてください!</FONT>'; 17 } else { 18 echo ""; 19 } 20} 21if ($_FILES['upfile']['error'] === 2) { 22 echo '<FONT COLOR="RED">ファイルサイズを小さくしてください!</FONT>'; 23} 24if (!preg_match('/\.jpg$|\.jpeg$/i', $tmp_name)) { 25 echo ""; 26} else { 27 echo '<FONT COLOR="RED">JPEGファイルを選択してください!</FONT>'; 28} 29 30?> 31

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

php

1// ここで $tmp_name に代入されている値を確認しましょう 2var_dump($tmp_name); 3 4if (!preg_match('/\.jpg$|\.jpeg$/i', $tmp_name)) { 5 echo ""; 6} else { 7 echo '<FONT COLOR="RED">JPEGファイルを選択してください!</FONT>'; 8}

そもそも $tmp_name には拡張子に当たる文字列は存在しない。
preg_match でファイルタイプを判定することがバッドノウハウです。

finfo_file で判定しましょう。

#サンプルコード

html

1<?php 2ini_set('display_errors', true); 3error_reporting(E_ALL); 4 5define('UP_DIR', 'updir'); 6 7function h($string) 8{ 9 return htmlspecialchars($string, ENT_QUOTES, 'utf-8'); 10} 11 12/** 13 * ファイルアップロードエラーを判定する 14 * @param type $upfile 15 * @return bool 16 * @throws Exception 17 */ 18function check_error($upfile) 19{ 20 switch ($upfile['error']) { 21 case UPLOAD_ERR_OK: 22 return true; 23 case UPLOAD_ERR_INI_SIZE: 24 $err = 'アップロードされたファイルは、php.ini の upload_max_filesize ディレクティブの値を超えています。'; 25 break; 26 case UPLOAD_ERR_FORM_SIZE: 27 $err = 'アップロードされたファイルは、HTML フォームで指定された MAX_FILE_SIZE を超えています。'; 28 break; 29 case UPLOAD_ERR_PARTIAL: 30 $err = 'アップロードされたファイルは一部のみしかアップロードされていません。'; 31 break; 32 case UPLOAD_ERR_NO_FILE: 33 $err = 'ファイルはアップロードされませんでした。'; 34 break; 35 case UPLOAD_ERR_NO_TMP_DIR: 36 $err = 'テンポラリフォルダがありません。'; 37 break; 38 case UPLOAD_ERR_CANT_WRITE: 39 $err = 'ディスクへの書き込みに失敗しました。'; 40 break; 41 case UPLOAD_ERR_EXTENSION: 42 $err = 'PHP の拡張モジュールがファイルのアップロードを中止しました。'; 43 break; 44 } 45 46 if (!empty($err)) { 47 throw new Exception($err); 48 } 49} 50 51/** 52 * ファイルタイプをチェックし、拡張子を返す 53 * @param type $upfile 54 * @return bool 55 */ 56function check_extension($upfile) 57{ 58 $arr_accept_mimes = [ 59 'jpg' => 'image/jpeg' 60 , 'png' => 'image/png' 61 , 'gif' => 'image/gif' 62 ]; 63 64 $finfo = finfo_open(FILEINFO_MIME_TYPE); 65 $mime_type = finfo_file($finfo, $upfile['tmp_name']); 66 67 if (in_array($mime_type, $arr_accept_mimes)) { 68 return array_search($mime_type, $arr_accept_mimes); 69 } 70 71 $msg = '許可されていないファイルタイプです。'; 72 throw new Exception($msg); 73} 74 75if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') === 'POST') { 76 77 try { 78 79 $upfile = $_FILES['upfile']; 80 81 // エラーチェック 82 check_error($upfile); 83 84 // ファイルタイプチェック 85 $extension = check_extension($upfile); 86 87 $tmp_name = $upfile['tmp_name']; 88 89 // ファイル保存先 + ファイル名 90 $base_name = sha1_file($tmp_name) . '.' . $extension; 91 92 if (!file_exists(UP_DIR)) { 93 $msg = sprintf('%s ディレクトリが存在しません。', UP_DIR); 94 throw new Exception($msg); 95 } 96 if (!is_writable(UP_DIR)) { 97 $msg = sprintf('%s に書き込み権限がありません。', UP_DIR); 98 throw new Exception($msg); 99 } 100 101 $destination = UP_DIR . DIRECTORY_SEPARATOR . $base_name; 102 if (file_exists($destination)) { 103 $msg = sprintf('同一のファイルがすでにアップロードされています。', UP_DIR); 104 throw new Exception($msg); 105 } 106 107 move_uploaded_file($tmp_name, $destination); 108 } catch (Exception $e) { 109 $err = $e->getMessage(); 110 } 111} 112?><!DOCTYPE HTML> 113<html lang="ja"> 114 <head> 115 <meta charset="UTF-8"> 116 <title></title> 117 <style type="text/css"> 118 .error { 119 color: red; 120 } 121 </style> 122 </head> 123 <body> 124 <form action="" enctype="multipart/form-data" method="post"> 125 <?php if (isset($err)) : ?> 126 <p class="error">エラー: <?= h($err); ?></p> 127 <?php endif; ?> 128 129 <p> 130 <label for="upfile">画像ファイル</label> 131 <input type="file" name="upfile" id="upfile" /> 132 </p> 133 <p> 134 <button type="submit">アップロード</button> 135 </p> 136 </form> 137 </body> 138</html>

#おまけ

このサンプルコードを書く様子を動画でキャプチャしてみました。
三流プログラマのもので申し訳ないが、デバッグの様子など見ると参考になるかも。

https://www.youtube.com/watch?v=PEDERfokvPU

投稿2017/01/17 08:55

編集2017/01/17 12:20
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

<input type="hidden" name="MAX_FILE_SIZE" value="524288"> でファイルサイズの上限を設定しているからではないでしょうか。 もしくはphp.iniやその他の設定ファイルでもこのサイズは設定できるので、そちらも見てみることをお勧めします。

投稿2017/01/17 08:49

s.t.

総合スコア2021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s.t.

2017/01/17 08:51

ちなみに $_FILES['upfile']['error']が2になるのは、 アップロードファイルの容量がHTMLファイルで指定したmax_file_size値を超えているためだと思われます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問