ドットインストールというサービスの「PHPで画像アップロード掲示板を作ろう」という動画レクチャーを受講しています。
これに出てくるリダイレクトのコードで、
php
1 header('Location: http://' . $_SERVER['HTTP_HOST']); 2 exit; 3 }
というのが出てきます。
しかし、いざ画像をアップロードするために画像を選択し、uploadボタンをクリックすると、リダイレクトが上手くいかず、代りに、
というページに飛んでしまいます。
これはおそらく、ドットインストールではvagrantを利用してローカル開発環境を構築しているのに対して、私はXAMPPを利用しているからだと思います。
どうすればドットインストールの動画どうりに実行されるのかと考えて、いろいろ試した挙句、
php
1echo $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
としてみると、ブラウザ側の挙動は同じになりましたが、今度は、(元画像から作成される)サムネイル画像が、サムネイルが入るはずのフォルダに入っていませんでした。
いろいろ調べたのですが、これ以上何をどうすればいいのか検討もつきませんので、ここで質問させていただきます。初歩的な質問なのかもしれませんが、わかる方はお教えください。お願いします。
以下、コードを貼ります。(作成途中のコードですので、画像がアップロードまではされずに、imagesフォルダとthumbsフォルダに画像が入るところまでいくはずの段階です)
index.php
php
1<?php 2ini_set('display_errors', 1); 3define('MAX_FILE_SIZE', 1 * 1024 * 1024); // 1MB 4define('THUMBNAIL_WIDTH', 400); 5define('IMAGES_DIR', __DIR__ . '/images'); 6define('THUMBNAIL_DIR', __DIR__ . '/thumbs'); 7 8if (!function_exists('imagecreatetruecolor')) { 9 echo 'GD not installed'; 10 exit; 11} 12 13function h($s) { 14 return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); 15} 16 17require 'ImageUploader.php'; 18 19$uploader = new \MyApp\ImageUploader(); 20 21if ($_SERVER['REQUEST_METHOD'] === 'POST') { 22 $uploader->upload(); 23} 24 25?> 26<!DOCTYPE html> 27<html lang="ja"> 28<head> 29 <meta charset="utf-8"> 30 <title>Image Uploader</title> 31 <style> 32 body { 33 text-align: center; 34 font-family: Arial, sans-serif; 35 } 36 </style> 37</head> 38<body> 39 40 <form action="" method="post" enctype="multipart/form-data"> 41 <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo h(MAX_FILE_SIZE); ?>"> 42 <input type="file" name="image"> 43 <input type="submit" value="upload"> 44 </form> 45 46</body> 47</html> 48
ImageUploader.php
php
1<?php 2 3namespace MyApp; 4 5class ImageUploader { 6 7 private $_imageFileName; 8 private $_imageType; 9 10 public function upload() { 11 try { 12 // error check 13 $this->_validateUpload(); 14 15 // type check 16 $ext = $this->_validateImageType(); 17 // var_dump($ext); 18 // exit; 19 20 // save 21 $savePath = $this->_save($ext); 22 23 // create thumbnail 24 $this->_createThumbnail($savePath); 25 26 } catch (\Exception $e) { 27 echo $e->getMessage(); 28 exit; 29 } 30 // redirect 31 header('Location: http://' . $_SERVER["HTTP_HOST"]); 32 exit; 33 } 34 35 private function _createThumbnail($savePath) { 36 $imageSize = getimagesize($savePath); 37 $width = $imageSize[0]; 38 $height = $imageSize[1]; 39 if ($width > THUMBNAIL_WIDTH) { 40 $this->_createThumbnailMain($savePath, $width, $height); 41 } 42 } 43 44 private function _createThumbnailMain($savePath, $width, $height) { 45 switch($this->_imageType) { 46 case IMAGETYPE_GIF: 47 $srcImage = imagecreatefromgif($savePath); 48 break; 49 case IMAGETYPE_JPEG: 50 $srcImage = imagecreatefromjpeg($savePath); 51 break; 52 case IMAGETYPE_PNG: 53 $srcImage = imagecreatefrompng($savePath); 54 break; 55 } 56 $thumbHeight = round($height * THUMBNAIL_WIDTH / $width); 57 $thumbImage = imagecreatetruecolor(THUMBNAIL_WIDTH, $thumbHeight); 58 imagecopyresampled($thumbImage, $srcImage, 0, 0, 0, 0, THUMBNAIL_WIDTH, $thumbHeight, $width, $height); 59 60 switch($this->_imageType) { 61 case IMAGETYPE_GIF: 62 imagegif($thumbImage, THUMBNAIL_DIR . '/' . $this->_imageFileName); 63 break; 64 case IMAGETYPE_JPEG: 65 imagejpeg($thumbImage, THUMBNAIL_DIR . '/' . $this->_imageFileName); 66 break; 67 case IMAGETYPE_PNG: 68 imagepng($thumbImage, THUMBNAIL_DIR . '/' . $this->_imageFileName); 69 break; 70 } 71 72 } 73 74 private function _save($ext) { 75 $this->_imageFileName = sprintf( 76 '%s_%s.%s', 77 time(), 78 sha1(uniqid(mt_rand(), true)), 79 $ext 80 ); 81 $savePath = IMAGES_DIR . '/' . $this->_imageFileName; 82 $res = move_uploaded_file($_FILES['image']['tmp_name'], $savePath); 83 if ($res === false) { 84 throw new \Exception('Could not upload!'); 85 } 86 return $savePath; 87 } 88 89 private function _validateImageType() { 90 $this->_imageType = exif_imagetype($_FILES['image']['tmp_name']); 91 switch($this->_imageType) { 92 case IMAGETYPE_GIF: 93 return 'gif'; 94 case IMAGETYPE_JPEG: 95 return 'jpg'; 96 case IMAGETYPE_PNG: 97 return 'png'; 98 default: 99 throw new \Exception('PNG/JPEG/GIF only!'); 100 } 101 } 102 103 private function _validateUpload() { 104 // var_dump($_FILES); 105 // exit; 106 107 if (!isset($_FILES['image']) || !isset($_FILES['image']['error'])) { 108 throw new \Exception('Upload Error!'); 109 } 110 111 switch($_FILES['image']['error']) { 112 case UPLOAD_ERR_OK: 113 return true; 114 case UPLOAD_ERR_INI_SIZE: 115 case UPLOAD_ERR_FORM_SIZE: 116 throw new \Exception('File too large!'); 117 default: 118 throw new \Exception('Err: ' . $_FILES['image']['error']); 119 } 120 121 } 122}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。