imagecreatefromstring

%e7%84%a1%e9%a1%8c
imagecreatefromstring
Create a new image from the image stream in the string

<?php
if (isset($_FILES&#91;'upfile'&#93;&#91;'error'&#93;) && is_int($_FILES&#91;'upfile'&#93;&#91;'error'&#93;)){
  try {
    // $_FILES&#91;'upfile'&#93;&#91;'error'&#93;の値を確認
    switch ($_FILES&#91;'upfile'&#93;&#91;'error'&#93;){
      case UPLOAD_ERR_OK:
        break;
      case UPLOAD_ERR_NO_FILE:
        throw new RuntimeException('ファイルが選択されていません');
      case UPLOAD_ERR_INI_SIZE:
      case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過
        throw new RuntimeException('ファイルサイズが大きすぎます');
      default:
        throw new RuntimeException('その他のエラーが発生しました');
    }

    // GD画像リソースの生成を試みる
    if (!$img = @imagecreatefromstring(file_get_contents($_FILES&#91;'upfile'&#93;&#91;'tmp_name'&#93;))){
      throw new RuntimeException('有効な画像ファイルを指定してください');
    }

    // ファイルデータからSHA-1ハッシュを取ってファイル名を決定し、保存する
    if (!imagepng($img, sprintf('./uploads/%s.png', sha1_file($_FILES&#91;'upfile'&#93;&#91;'tmp_name'&#93;)))){
      throw new RuntimeException('ファイル保存時にエラーが発生しました');
    }
    $msg = &#91;'green', 'ファイルは正常にアップロードされました'&#93;;
  } catch (RuntimeException $e){
    $msg = &#91;'red', $e->getMessage()];
  }

  if (isset($img) && is_resource($img)){
    imagedestroy($img);
  }
}

// XTHMLとしてブラウザに認識させる
// (IE8以外はサポート対象外)
header('Content-Type: application/xhtml+xml; charset=utf-8');
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>画像アップロード</title>
</head>
<body>
<?php if (isset($msg)): ?>
  <fieldset>
    <legend>結果</legend>
    <span style="color:<?=$msg&#91;0&#93;?>;"><?=$msg&#91;1&#93;?></span>
  </fieldset>
<?php endif; ?>
  <form enctype="multipart/form-data" method="post" action="">
    <fieldset>
      <legend>画像ファイルを選択</legend>
      <input type="file" name="upfile" /><br />
      <input type="submit" value="送信" />
    </fieldset>
  </form>
</body>
</html>