teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

php-5.3対応、注意事項追記

2017/12/25 11:44

投稿

Tomak
Tomak

スコア1652

answer CHANGED
@@ -13,8 +13,12 @@
13
13
  ソースコードを根本的に改善したわけではなく、単純に詳細なエラー処理を入れただけです。これでどこの処理で不具合が起きているのかはっきりすると思います。
14
14
 
15
15
  **※注意**
16
- __たぶん今回は関係ないですが、PHP-5.4以下でセーフモードONでPHPが動いている場合、画像移動先ディレクトリのオーナー確認が行われます。__
16
+ たぶん今回は関係ないですが、PHP-5.4以下でセーフモードONでPHPが動いている場合、画像移動先ディレクトリのオーナー確認が行われます。`echo`でエラーメッセージ表示をおこなう場合は、**echo**した後もコードが実行されてしまうことに注意しなければなりません。
17
17
 
18
+ **※PHP-5.3対応**
19
+ PHP-5.3では`array()`を`[]`とは書けないので編集しました。また、画像のMIMEタイプを判別してから移動するようにしました。PHP-5.3でも`try~catch()`や`throw new Exception()`などを使うことができます。
20
+
21
+ `imagecreatefromjpeg()`の続きがあるのかないのかわらないので、とりあえず画像のアップロードという意味では下記で完了です。
18
22
  ```php
19
23
  try {
20
24
  $file_tmp = $_FILES['take-picture-input']['tmp_name'];
@@ -28,23 +32,28 @@
28
32
  throw new Exception('アップロードに失敗しました。');
29
33
  }
30
34
 
31
- //アップロード画像移動
32
- if (! move_uploaded_file($file_tmp, $tmp_name)) {
33
- throw new Exception('アップロード画像の移動に失敗しました。アップ先:'. $tmp_name .'アップ元:'. $file_tmp);
34
- }
35
-
36
35
  //画像タイプ判別
37
- $mimeType = mime_content_type($tmp_name);
36
+ $mimeType = mime_content_type($file_tmp);
38
37
 
39
38
  //JPEGのみ許可?
40
- $accepted = ['jpg' => 'image/jpeg'];
39
+ $accepted = array('jpg' => 'image/jpeg');
41
- //$accepted = ['gif' => 'image/gif', 'jpg' => 'image/jpeg', 'png' => 'image/png'];
40
+ //$accepted = array('gif' => 'image/gif', 'jpg' => 'image/jpeg', 'png' => 'image/png');
42
41
 
43
42
  if (false === array_search($mimeType, $accepted)) {
44
- //unlink($tmp_name);
45
43
  throw new Exception('ファイルは画像ではありません。タイプ:'. $mimeType);
46
44
  }
47
45
 
46
+ //アップロード画像移動
47
+ if (! move_uploaded_file($file_tmp, $tmp_name)) {
48
+ throw new Exception('アップロード画像の移動に失敗しました。アップ先:'. $tmp_name .'アップ元:'. $file_tmp);
49
+ }
50
+
51
+ echo '画像のアップロードに成功しました。パス:'. $tmp_name;
52
+
53
+ /*
54
+ //何したいのかよくわからないので、とりあえずコメントアウト
55
+ //サムネイル画像とか画像を加工したい?
56
+
48
57
  //画像オープン
49
58
  $file_tmp = @imagecreatefromjpeg($tmp_name);
50
59
 
@@ -56,10 +65,18 @@
56
65
  //失敗
57
66
  else {
58
67
  //unlink($tmp_name);
59
- throw new Exception('画像オープンに失敗しました');
68
+ throw new Exception('画像オープンに失敗しました。パス:'. $tmp_name);
60
69
  }
70
+ */
61
71
  }
62
72
  catch(Exception $e) {
63
73
  echo $e->getMessage();
64
74
  }
65
- ```
75
+ ```
76
+
77
+ `imagecreatefromjpeg()`を使う場合で、「画像オープンに失敗しました」であれば、アップロード自体は完了しており、画像はサーバーに上がっているはずです。
78
+ 画像を編集するならGD(imagecreatefromjpeg())などを使う必要ありますが、単純にアップロードするだけなら使う必要がありません。そして、PHPで画像をオープンする際はPHPの`memory_limit`制限に依存します。
79
+
80
+ サーバーの搭載メモリを超えている大きなサイズの画像を処理したい場合は、外部コマンド「ImageMagic」などを使用します。
81
+
82
+ その他確認事項としては、サーバーにPOSTしたファイルをダウンロードして確認してみる方法もあります。つまり、JPEGだけど中身は別形式になってるとかいうケースもあります。