Advertisement
Guest User

Untitled

a guest
Apr 14th, 2014
1,044
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.83 KB | None | 0 0
  1. <?php
  2.  
  3. /* 設定 */
  4. $range = range(0, 2); // upfileの使用するキーの範囲
  5. $dir = './images'; // 保存に使用するディレクトリ
  6.  
  7. if (isset($_POST['uploadfile'], $_FILES['upfile']['error']) && is_array($_FILES['upfile']['error'])) {
  8.    
  9.     // 各ファイルをチェック
  10.     foreach ($_FILES['upfile']['error'] as $k => $error) {
  11.  
  12.         try {
  13.  
  14.             // 更に配列がネストしている、または想定外のキーであれば不正とする
  15.             $k = (int)$k;
  16.             if (!is_int($error) || !in_array($k, $range, true)) {
  17.                 throw new RuntimeException("[{$k}] パラメータが不正です");
  18.             }
  19.            
  20.             // ファイルが既に存在しているかどうかチェックする
  21.             if (is_file("{$dir}/{$k}")) {
  22.                 throw new RuntimeException("[{$k}] ファイルが既に存在しています");
  23.             }
  24.  
  25.             // $_FILES['upfile']['error'][$k] の値を確認
  26.             switch ($error) {
  27.                 case UPLOAD_ERR_OK: // OK
  28.                     break;
  29.                 case UPLOAD_ERR_NO_FILE:   // ファイル未選択
  30.                     continue 2;
  31.                 case UPLOAD_ERR_INI_SIZE:  // php.ini定義の最大サイズ超過
  32.                 case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過
  33.                     throw new RuntimeException("[{$k}] ファイルサイズが大きすぎます");
  34.                 default:
  35.                     throw new RuntimeException("[{$k}] その他のエラーが発生しました");
  36.             }
  37.            
  38.             // $_FILES['upfile']['mime']の値はブラウザ側で偽装可能なので
  39.             // MIMEタイプを自前でチェックする
  40.             if (!in_array(
  41.                 @exif_imagetype($_FILES['upfile']['tmp_name'][$k]),
  42.                 array(
  43.                     IMAGETYPE_GIF,
  44.                     IMAGETYPE_JPEG,
  45.                     IMAGETYPE_PNG,
  46.                 ),
  47.                 true
  48.             )) {
  49.                 throw new RuntimeException("[{$k}] 画像形式が未対応です");
  50.             }
  51.            
  52.             // キー番号をファイル名にして保存する
  53.             if (!move_uploaded_file($_FILES['upfile']['tmp_name'][$k], "{$dir}/{$k}")) {
  54.                 throw new RuntimeException("[{$k}] ファイル保存時にエラーが発生しました");
  55.             }
  56.            
  57.             $msgs[] = array('green', "[{$k}] 保存しました");
  58.  
  59.         } catch (RuntimeException $e) {
  60.  
  61.             $msgs[] = array('red', $e->getMessage());
  62.  
  63.         }
  64.    
  65.     }
  66.    
  67. } elseif (isset($_POST['resetfile']) && is_array($_POST['resetfile'])) {
  68.    
  69.     // 各ファイルをチェック
  70.     foreach ($_POST['resetfile'] as $k => $dummy) {
  71.        
  72.         try {
  73.            
  74.             // 想定外のキーであれば不正とする
  75.             $k = (int)$k;
  76.             if (!in_array($k, $range, true)) {
  77.                 throw new RuntimeException("[{$k}] パラメータが不正です");
  78.             }
  79.            
  80.             // 存在しているかどうかチェックする
  81.             if (!is_file("{$dir}/{$k}")) {
  82.                 throw new RuntimeException("[{$k}] ファイルが存在しません");
  83.             }
  84.            
  85.             // 削除する
  86.             if (!unlink("{$dir}/{$k}")) {
  87.                 throw new RuntimeException("[{$k}] 削除に失敗しました");
  88.             }
  89.            
  90.             $msgs[] = array('green', "[{$k}] 削除しました");
  91.  
  92.         } catch (RuntimeException $e) {
  93.  
  94.             $msgs[] = array('red', $e->getMessage());
  95.  
  96.         }
  97.        
  98.     }
  99.    
  100. }
  101.  
  102. // XHTMLとしてブラウザに認識させる
  103. // (IE8以下はサポート対象外w)
  104. header('Content-Type: application/xhtml+xml; charset=utf-8');
  105.  
  106. ?>
  107. <!DOCTYPE html>
  108. <html xmlns="http://www.w3.org/1999/xhtml">
  109. <head>
  110.   <title>画像アップロード&削除</title>
  111. </head>
  112. <body>
  113. <?php if (!empty($msgs)): ?>
  114.   <ul>
  115. <?php foreach ($msgs as $msg): ?>
  116.     <li style="color:<?=$msg[0]?>;"><?=$msg[1]?></li>
  117. <?php endforeach; ?>
  118.   </ul>
  119. <?php endif; ?>
  120.   <form enctype="multipart/form-data" method="post" action="">
  121.     <fieldset>
  122.       <legend>画像ファイルを選択 <input type="submit" name="uploadfile" value="アップロード" /></legend>
  123. <?php foreach ($range as $k): ?>
  124.       <p>
  125. <?php if ($k): ?>
  126.         <hr />
  127. <?php endif; ?>
  128.         画像 <?=$k?><br />
  129. <?php if (!is_file("{$dir}/{$k}")): ?>
  130.         <input type="file" name="upfile[<?=$k?>]" /><br />
  131. <?php else :?>
  132.         <img src="<?="{$dir}/{$k}"?>" alt="画像<?=$k?>" /><br />
  133.         <input type="submit" name="resetfile[<?=$k?>]" value="削除" /><br />
  134. <?php endif; ?>
  135.       </p>
  136. <?php endforeach; ?>
  137.     </fieldset>
  138.   </form>
  139. </body>
  140. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement