アーカイブ
-
[PHP]サムネイル
同僚のハリネズミに依頼されてたような気がするのでアップしてみた。
>>ハリネズミ
CFシリーズに入れたょ。#*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* # saveImageFile # [説明] # イメージファイルのローカル保存、もしくはイメージ出力 # [パラメータ] # $pImageUri[I] string # ⇒イメージファイルのURI(http://形式でも、物理パスでも可) # $pSaveFileName[I] string # ⇒保存ファイルのファイルパス # ※pSaveFileがtrueの場合に有効 # $pMaxWidth[I] integer # ⇒保存時の最大の横幅( 0を指定するとそのままで、1以上の正数値を指定するとサムネイル可します。) # $pDegrees[I] integer # ⇒回転角度。確か時計回りで何度回転するかを指定 # $pSaveFile[I] boolean # ⇒ファイルを保存するか否か、falseを指定するとそのままレスポンスとしてイメージ出力します。 # [返り値] mixed # ⇒TRUE: 処理成功 # TRUE以外: 処理失敗 #*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* function saveImageFile( $pImageUri , $pSaveFileName , $pMaxWidth = 0 , $pDegrees = 0 , $pSaveFile = TRUE ){ $returnValue = FALSE; $rsImage = FALSE; $rsRotate = FALSE; $rsNewImage = FALSE; if( !extension_loaded('gd') && !extension_loaded('gd2') ){ # 拡張モジュールのロードに失敗 return $returnValue; } # サイズ情報の取得 list( $imageWidth, $imageHeight, $imageType ) = @getimagesize( $pImageUri ); #----------------------------------------------------------- # イメージファイルの読み込み switch( $imageType ){ case IMAGETYPE_GIF: $rsImage = @imagecreatefromgif( $pImageUri ); break; case IMAGETYPE_JPEG: $rsImage = @imagecreatefromjpeg( $pImageUri ); break; case IMAGETYPE_PNG: $rsImage = @imagecreatefrompng( $pImageUri ); break; } #----------------------------------------------------------- # イメージの回転 if( $rsImage !== FALSE ){ $rsRotate = @imagerotate( $rsImage, 360-$pDegrees, 0) ; } #----------------------------------------------------------- # リサイズイメージの作成 if( $rsRotate !== FALSE ){ # 回転後のイメージサイズの取得 $imageWidth = ImageSX($rsRotate); $imageHeight = ImageSY($rsRotate); # リサイズ後のサイズを算出 if( $pMaxWidth == 0 or $imageWidth <= $pMaxWidth ){ # そのまま $newWidth = $imageWidth; $newHeight = $imageHeight; }else{ # 最大サイズより大きい場合 => 縮小 $newHeight = intval(( (float)$pMaxWidth / (float)$imageWidth ) * (float)$imageHeight); $newWidth = $pMaxWidth; } # 空画像を作成 if( function_exists("imagecreatetruecolor") ){ $rsNewImage = @imagecreatetruecolor( $newWidth, $newHeight ); }else{ $rsNewImage = @imagecreate( $newWidth, $newHeight ); } # サンプリングしなおす if( function_exists("imagecopyresampled") ){ $returnValue = @imagecopyresampled( $rsNewImage, $rsRotate, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight ); if( $returnValue === FALSE ){ $returnValue = @imagecopyresized( $rsNewImage, $rsRotate, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight ); } }else{ $returnValue = @imagecopyresized( $rsNewImage, $rsRotate, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight ); } } if( $pSaveFile ){ #----------------------------------------------------------- # イメージファイルの保存 if( $returnValue !== FALSE && $rsNewImage !== FALSE ){ switch( $imageType ){ case IMAGETYPE_GIF: $returnValue = @imagegif( $rsNewImage, $pSaveFileName ); break; case IMAGETYPE_JPEG: $returnValue = @imagejpeg( $rsNewImage, $pSaveFileName, 100 ); break; case IMAGETYPE_PNG: $returnValue = @imagepng( $rsNewImage, $pSaveFileName ); break; } } }else{ #----------------------------------------------------------- # イメージファイルの表示 if( $returnValue !== FALSE && $rsNewImage !== FALSE ){ switch( $imageType ){ case IMAGETYPE_GIF: header("Content-type: image/gif"); $returnValue = @imagegif( $rsNewImage ); break; case IMAGETYPE_JPEG: header("Content-type: image/jpeg"); $returnValue = @imagejpeg( $rsNewImage, "", 100 ); break; case IMAGETYPE_PNG: header("Content-type: image/png"); $returnValue = @imagepng( $rsNewImage ); break; } } } #----------------------------------------------------------- # リソースの解放 @imagedestroy($rsImage); @imagedestroy($rsRotate); @imagedestroy($rsNewImage); return $returnValue; }2010年 2月 26日 | Filed under PHPタグ: PHP -
[PHP]file_get_contents で UserAgent を指定
PHPのfile_get_contents()関数をそのまま使用すると、
『PHP/x.x.x』という素直なユーザエージェントが相手に通知されます。それが気になる時もあって良いじゃないですか。
ということで、ユーザエージェントを変更できるようにしてみた。
(ついでにリファラーも。。。)
stream_context_create()がポイントになるのだけど、考えてみたらPOST版もさっくり出来そうな気が・・・。
それはさておき、今回はGET版でのテンプレートです。function _file_get_contents( $url , $referer = "" , $useragent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7" ){ # User-Agentを指定 $header = "User-Agent: ".$useragent."\r\n"; # Refererを指定 if( strlen($referer) > 0 ){ $header .= "Referer: ".$referer."\r\n"; } $options = array( "http"=> array( "method" => "GET" , "header" => $header ) ) ; return @file_get_contents( $url, FALSE, stream_context_create($options) ); }使い方はこんな感じ。
echo _file_get_contents( "http://www.google.com/" , "http://jp.msn.com/" , "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" );ちなみに、POSTでのcontextの作成例はこんな感じ。
$context = stream_context_create(array( 'http' => array( 'method' => 'POST', 'header' => sprintf("Authorization: Basic %s\r\n", base64_encode($username.':'.$password)). "Content-type: application/x-www-form-urlencoded\r\n", 'timeout' => 5, ), ));当たり前といえばそうだけど、basic認証でも行けちゃうんですね♪
すばらしい♪2010年 2月 26日 | Filed under PHPタグ: PHP -
[PHP]メール受信プログラムのサンプル
だいぶ固まってきたので、テンプレート化してみた。
メールの受信サーバーから、パイプライン処理等で、PHPプログラムを直接起動し、標準入力(STDIN)経由でメールデータを受信するサンプルです。
細かい制御はしてませんが、ほぼこれでさっくり動くはず。require_once 'Mail.php'; require_once 'Mail/mimeDecode.php'; #--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-- # 以下、サブ関数の定義 #--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-- # デコード済みMIMEヘッダーよりメールアドレスを抽出する。 function _extractMailAddress( $pDecodedMimeHeader ){ $returnValue = FALSE; if( eregi( "[-!#$%&\'*+\\.=/0-9A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+" , $pDecodedMimeHeader , $regs ) ){ # 行頭・行末の空白削除 $returnValue = mb_ereg_replace("^[ ]*(.*)[ ]*$", "\\1", $regs[0]); } return $returnValue; } # 受信メールをパースします。 function _parseMail( &$pDecodedMimeStructure , &$pResultSet ){ #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-- # message-idを取得する $pResultSet["message-id"] = $pDecodedMimeStructure->headers["message-id"]; $pResultSet["message-id"] = mb_convert_encoding( $pResultSet["message-id"], mb_internal_encoding(), "auto" ); $pResultSet["message-id"] = str_replace( array("<", ">"), "", $pResultSet["message-id"] ); #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-- # fromを取得する $pResultSet["from"] = $pDecodedMimeStructure->headers["from"]; $pResultSet["from"] = mb_decode_mimeheader( $pResultSet["from"] ); $pResultSet["from"] = mb_convert_encoding( $pResultSet["from"], mb_internal_encoding(), "auto" ); $pResultSet["from"] = _extractMailAddress( $pResultSet["from"] ); #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-- # toを取得する $pResultSet["to"] = $pDecodedMimeStructure->headers["to"]; $pResultSet["to"] = mb_decode_mimeheader( $pResultSet["to"] ); $pResultSet["to"] = mb_convert_encoding( $pResultSet["to"], mb_internal_encoding(), "auto" ); $pResultSet["to"] = _extractMailAddress( $pResultSet["to"] ); #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-- # subjectを取得する $pResultSet["subject"] = $pDecodedMimeStructure->headers["subject"]; $pResultSet["subject"] = mb_decode_mimeheader( $pResultSet["subject"] ); $pResultSet["subject"] = mb_convert_encoding( $pResultSet["subject"], mb_internal_encoding(), "auto" ); #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-- # 日付を取得する $pResultSet["date"] = strtotime($pDecodedMimeStructure->headers["date"]); #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-- # bodyと添付ファイルをパース $pResultSet["body"] = ""; $pResultSet["attachments"] = array(); switch(strtolower($pDecodedMimeStructure->ctype_primary)){ # シングルパート(テキストのみ) case "text": $pResultSet["body"] = $pDecodedMimeStructure->body; $pResultSet["body"] = mb_convert_encoding( $pResultSet["body"], mb_internal_encoding(), "auto" ); break; # マルチパート case "multipart": foreach($pDecodedMimeStructure->parts as $part){ switch(strtolower($part->ctype_primary)){ # テキスト case "text": $pResultSet["body"] = $part->body; $pResultSet["body"] = mb_convert_encoding( $pResultSet["body"], mb_internal_encoding(), "auto" ); break; # 画像 case "image": $attachment = array(); $attachment["mime_type"] = $part->ctype_primary."/".$part->ctype_secondary; $attachment["filename"] = mb_convert_encoding( $part->ctype_parameters["name"], mb_internal_encoding(), "auto" ); $attachment["binary"] = $part->body; $pResultSet["attachments"][] = $attachment; break; # 其れ以外 default: break; } } break; # 其れ以外 default: break; } #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-- # bodyに含まれている改行コードの統一 $pResultSet["body"] = mb_eregi_replace("(\r\n|\r)","\n",$pResultSet["body"]); #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-- # ここで処理終了 return TRUE; } #--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-- # 以下、メイン処理 #--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-- # 言語設定、内部エンコーディングを指定する mb_language("japanese"); mb_internal_encoding("eucJP-win"); mb_regex_encoding(mb_internal_encoding()); #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-- # メールソースを読み込む $source = @file_get_contents("php://stdin"); if( !empty($source) ){ #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-- # メールをMIMEデコードする $decoder = new Mail_mimeDecode( $source ); $params = array(); $params["include_bodies"] = TRUE; # ボディを解析する $params["decode_bodies"] = TRUE; # ボディをコード変換する $params["decode_headers"] = TRUE; # ヘッダをコード変換する $structure = $decoder->decode( $params ); #--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-- # メールデータの解析 $maildata = array(); _parseMail( $structure, $maildata ); print_r($maildata); }2010年 2月 22日 | Filed under PHP -
IEの場合だけ、フォームでEnterを押してもうまく動作しない
IEの6~8で確認したのだけど、Form内でのSubmitボタン押下を、Enterキー押下でやったときに、そのSubmitボタンがリクエストに格納されてない、という不具合に、本日ぶち当たりました。
ググってみると、OPQR.jpさんのページを見つけて、無事原因が分かりました♪
理由はIEの場合、
テキストボックスが1つしかないフォームでは、
Enterキーを押しても、submitボタンの情報がサーバに送信されない
という、バグ(仕様?)らしい。マイクロソフトさん、嗚呼、そうですか?
名前を、「真っ黒ソフト」に帰ればいいのにw(上司談解決策としては、下記のように、1つテキストボックスをダミーで追加。
スタイル設定で見えなくすればいいらしい。
最初のテキストは送信される模様なので、要は、テキストボックスを2つ以上にすればいいってことみたいです。<form name="" method="POST" action=""> <input type="text" name="" value="" /> <input type="submit" name="" value="送信" /> <!-- ↓これが対処策 --> <input type="text" name="ie_no_baka" value="" style="display:none;" /> </form>2010年 1月 28日 | Filed under PHP -
PHPで使用可能な文字コード
PHPで使用可能な文字コードは、mb_list_encodings()で取得することができる。
正確には大文字・小文字も区別して使用する必要があるようです。
詳しくは、pentan.infoさんの「mb_strlenやmb_strimwidthの注意点」を参照して下さい。
代表的なものは下記の通り。
pass auto wchar byte2be byte2le byte4be byte4le BASE64 UUENCODE HTML-ENTITIES Quoted-Printable 7bit 8bit UCS-4 UCS-4BE UCS-4LE UCS-2 UCS-2BE UCS-2LE UTF-32 UTF-32BE UTF-32LE UTF-16 UTF-16BE UTF-16LE UTF-8 UTF-7 UTF7-IMAP ASCII EUC-JP SJIS eucJP-win SJIS-win CP51932 JIS ISO-2022-JP ISO-2022-JP-MS Windows-1252 ISO-8859-1 ISO-8859-2 ISO-8859-3 ISO-8859-4 ISO-8859-5 ISO-8859-6 ISO-8859-7 ISO-8859-8 ISO-8859-9 ISO-8859-10 ISO-8859-13 ISO-8859-14 ISO-8859-15 ISO-8859-16 EUC-CN CP936 HZ EUC-TW BIG-5 EUC-KR UHC ISO-2022-KR Windows-1251 CP866 KOI8-R ArmSCII-8
2010年 1月 13日 | Filed under PHPタグ: 文字コード -
モバイルクローラのユーザエージェント
ついつい忘れがちになるので、改めてここでメモ

ユーザエージェントに含まれる主要なモバイルクローラのキーワード
- docomo(iメニュー公式検索サービス):「i-robot」
- au(EZweb公式検索サービス):「KDDI-Googlebot-Mobile」
- SoftBank(Yahoo!ケータイ):「SNVSE00000001」
- Googleモバイル:「Googlebot-Mobile」
- Yahoo!モバイル:「Y!J-SRD」「Y!J-MBS」
2010年 1月 13日 | Filed under PHP -
[PHP] あるはずのクラスが見つからない
ec-cube系でのインストールトラブルで分かったことなのだけど、PHP5.2系での環境でクラスの多重継承を行っているプログラムで、あるはずのクラスが見つからないと、実行エラーを出すことがあります。
5.2系では動作しなくて、5.1系では動作する。こんな現象があったら、おそらくこれ↓が原因だと。
しかも↓の記事をGoogleなどで検索で、なかなか適したキーワードで見つからなかった。
ほんとここに行き着くまでに時間が掛かりましたょ。PHPプロ!requireするとextendsしたクラスを見つけてくれない
おぃおぃ!って感じですね

オブジェクト指向プログラミングの観点で考えると、致命的なバグ
5.3では治ってるのかしら。
2010年 1月 8日 | Filed under PHP