画像の拡張子

2008/12/18 | その他, ケータイ

PHPでCMSを作る場合、画像をアップロードして反映させる機能を作ることも多い。その際どんな風に作るのが一般的なんだろうか、と疑問に思ったので、現在の自分の作業をメモしておくことにする。

  1. アップロードされたファイルの形式をチェックする
    画像かどうかのチェックは必須とする。
  2. ファイルの拡張子なしで保存する
    拡張子なしのファイル名で画像を保存する。PCブラウザは、拡張子なしでもだいたい対応してくれるので。
拡張子なしにすることによってプログラムに手抜きができることが多い。でも携帯は拡張子でファイル形式を判断しているので、別途プログラムをかませて出力しなければならない。手元のドコモ、ソフトバンク、AUの各端末では、いずれも拡張子なしの画像を表示させることはできなかった。

mb_encode_mimeheaderの使い方

2008/12/07 | PHPの基本

PHPからメールを送信するとき、mail関数やmb_send_mail関数などを使う。このとき、Fromとして送信元を指定する場合、第4引数として「From: test@example.com」のように与えると、送信元を指定したメールを送信することができる。ただしこのままでは日本語は使えない。この引数はそのままメールのヘッダとして追加されるので、日本語は適切に変換をかけなければいけないことになっている。

ここまでは当たり前の話だが、注意しなくてはいけないのは、日本語の適切な変換をかけるための関数「mb_encode_mimeheader」の使い方だ。マニュアルを見ると以下のように書いてある。

string mb_encode_mimeheader ( string str [, string charset [, string transfer_encoding [, string linefeed]]] )

mb_encode_mimeheader() は、MIME ヘッダ エンコーディング方式によって文字列 str をエンコードします。この関数は、ASCII 表現の文字列を返します。
charset
は、str の文字セット名です。デフォルトは、現在の NLS 設定 (mbstring.language)によって決まります。
transfer_encoding
は MIME エンコーディングの 方式を指定します。“B” (Base64) または “Q” (Quoted-Printable) のどちらかでなければなりません。 デフォルトは “B” です。

第一引数はいうまでもなく変換したい文字列だ。この関数では基本的にこの第1引数だけを指定しておくのが無難。必要に応じて以降の引数を設定することもあるだろうが、第2引数の扱いには注意が必要だ。

マルチバイト関数ならたいてい使用している文字コードを引数として与えるオプションがついている(これはmbstring.internal_encodingに連動している)。しかしこのmb_encode_mimeheaderで与えるcharaset(第2引数)はその意味がまったく異なる(ようだ)。

例えばUTF-8でプログラムを記述しているからといって以下のように記述するのはNGだ。

mb_encode_mimeheader($str, ‘UTF-8′);

変換結果を出力すると以下のようになっている。

=?UTF-8?B?・・・・・・・・・・・・

本来なら「=?ISO-2022-JP?B?・・・・・・・・・・・」なはずなのに・・・。理由は省略するとして正しくは以下のように記述しておくのが無難なようだ。

mb_language(‘Japanese’);
mb_internal_encoding(‘UTF-8′);
$str=mb_encode_mimeheader($str);

1行目のmb_language関数でmb_encode_mimeheader関数に対して「日本語ルールで変換せよ」と命令していることになる。2行目で「現状文字列はUTF-8で記述されているので、UTF-8から変換すればよいものと想定して処理せよ」といった感じだろうか。だから1行目と2行目を記述しておくことだけでいいはずだ。

ちなみに引数として渡すには、以下の内容でmail関数やmb_send_mail関数の第4引数として渡せばよい。

mb_language(‘Japanese’);
mb_internal_encoding(‘UTF-8′);
$option=’From: ‘.mb_encode_mimeheader(‘名前’).'<test@example.com>';
mail($recipient,$subject,$message,$option);

Smartyのフィルタ

2008/11/28 | Smarty

携帯サイト等シフトJISでサイトを構築する場合、Smartyを使うことにしている。PHP自体はシフトJISでの記述はNGなのでUTF-8で記述し、テンプレートHTMLをシフトJISで記述して使用している。素でそのまま使ってしまうと文字化けしてしまうので、テンプレートを読み込む際にいったん文字コードをUTF-8に変換し、出力するときに再度シフトJISに変換するような処理をしている。

そのときに便利な機能がSmartyのフィルタだ。フィルタにはプレフィルタ、ポストフィルタ、アウトプットフィルタの3種類があり、用途は以下のとおり。

  • プレフィルタ(prefilter)
    テンプレートをコンパイルする際(コンパイル前)にテンプレートファイルに対して処理が施される。
  • ポストフィルタ(postfilter)
    テンプレートをコンパイルする際(コンパイル後)にテンプレートファイルに対して処理が施される。
  • アウトプットフィルタ(outputfilter)
    コンパイルされたテンプレートに対して出力用の変数がアサイン等され、実際に出力する際に処理が施される。

実は最初勘違いしていた。プレフィルタとポストフィルタだけだと思っていた。テンプレート読み込み時にプレフィルタにかけられ、HTML出力時にポストフィルタにかけられると思っていた。Smartyを使った処理を記述する際に、希望通りの動作をしてくれないのでマニュアルを読み直してみて初めて知った。ちょっと恥ずかしい。

拡張子htmlでphpプログラムを使えるように

2008/11/24 | apache

もう何十回もhtaccessに記述しているのに、必要に迫られ、その都度検索している自分が悲しい。メモしておくことにする。

AddType application/x-httpd-php .html

覚えられないのは老化?。

ウェブサイトを移転したときに

2008/11/10 | その他

ウェブサイトを移転をスマートにおこなう方法。移転といってもいろいろな種類があるけど、今回はサーバのコンテンツはまったくそのままで、別のサーバ(もしくは別のディレクトリ)へ移動させる場合を考えた(基本的に別サーバへの移転として考える)。まず新しいサイトを用意しておくのはいいとして、古いサイトから新しいサイトへの移動のさせ方が問題だ。やり方としては4つ思いつく。

  1. 全ページに「移動しました」と掲載する
    全ページに記述しなくてはいけないので大変。
  2. 全ページにメタタグを書いて移動させる
    1と併用。同じく全ページに記述しなくてはいけないので大変。
  3. .htaccessだけで飛ばす
    Redirect permanent /hoge/ http://example.com/hoge
    結局全ファイルだけ書かなきゃいけないか・・・。
  4. mod_rewriteで飛ばす
    mod_rewriteで、リダイレクトさせる。これお勧め。
    RewriteEngine on
    RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

4が便利でお勧め。このサイトもコレを使って移転しました。古いURL(php.atseason.com)でブックマークしている方は、新しいURL(php.tekmemo.com)でのブックマークをお願いします。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net