XAMPP で Windows 上に Webサーバー(Apache) と PHP と MySQL と FTPサーバー(Filezilla) と メールサーバー(Mercury) を一括でインストール

2008年4月18日 23:59 XAMPP で Windows 上に Webサーバー(Apache) と PHP と MySQL と FTPサーバー(Filezilla) と メールサーバー(Mercury) を一括でインストール

Windows上にPHPの開発環境を用意する上で、非常に便利な XAMPP の紹介です。

XAMPP を使えば、一括で以下の環境を Windows 上に用意することができます。

  • Webサーバー(Apache)
  • PHP
  • MySQL
  • phpMyAdmin
  • FTPサーバー(FileZilla)
  • メールサーバー(Mercury)

それぞれを別個のサイトからダウンロードしてインストールしなくても、XAMPPだけで、これらの開発環境が揃うわけです。
便利な世の中になったもんですよねー。

というわけで、以下導入手順です。

1. XAMPP をダウンロードする

XAMPP 導入手順(1)

apache friends - xampp for windowsへアクセスし、XAMPP をダウンロードします。

 
XAMPP 導入手順(2)

画面を下の方にスクロールしていくと、ダウンロードサイトへのリンク一覧が出てきます。

特にこだわりや理由がなければ、インストーラをダウンロードするのが手っ取り早いと思います。

「XAMPP Windows版 〔ベーシックパッケージ〕」の「インストーラ」のリンクからダウンロードします。

 

2. XAMPP をインストールする

XAMPP 導入手順(3)

ダウンロードした XAMPP インストーラを起動すると、言語選択のダイアログが表示されます。

「Japanese」を選択して「OK」をクリック。

 
XAMPP 導入手順(4)

「セットアップウィザードへようこそ」という画面が表示されるので、「次へ」をクリック。

 
XAMPP 導入手順(5)

インストール先のフォルダを指定します。
左記画面の例では、「C:\xampp」を指定しています。

ここで指定したフォルダに、 XAMPP のコントロールパネルとか、Apache とか MySQL とか PHP とか、その他もろもろが全部インストールされます。

指定したら「次へ」をクリック。

 
XAMPP 導入手順(6)

オプション設定画面。

「Apache をサービスとしてインストール」「MySQL をサービスとしてインストール」「FileZilla をサービスとしてインストール」にチェックを入れておくと、これらを Windows サービスとして利用できるので、便利です。

ただし、既にWindows 上でWebサーバーとして IIS を利用している場合等は、一旦 IIS を停止しておかないと、サービスとして Apache がインストールできなかったり、色々と不具合があるかもしれません。

チェックを入れたら「インストール」をクリック。

 
XAMPP 導入手順(7)

インストールが始まります。

そこそこ時間がかかるので、しばらく待ちましょう。

 
XAMPP 導入手順(8)

インストール完了画面。
これでXAMPP のインストールは完了です。

「完了」をクリック。

 

3. コントロールパネルを触ってみる&セキュリティ関連の設定

XAMPP 導入手順(9)

インストールが完了すると、「XAMPP コントロールパネルを今すぐ起動しますか?」というダイアログが表示されます。

「はい」をクリック。

 
XAMPP 導入手順(10)

XAMPP のコントロールパネルが起動します。

この手順通りにインストールしていれば、「Apache」「MySQL」「FileZilla」が「起動」の状態になっているかと思います。

各モジュールの右側にある「停止」または「停止中」ボタンをクリックすれば、それぞれのサーバーを停止できます。

 
XAMPP 導入手順(11)

さて、実際にApache が Webサーバーとして動いているのか、確認してみましょう。

ブラウザを立ち上げて、http://localhost/ あるいは、http://127.0.0.1/ へアクセスしてみます。

左記のような画面が表示されれば、Apache は正常に動作しています。

XAMPP の Web管理画面に入るため、右下の「日本語」をクリックします。

 
XAMPP 導入手順(12)

XAMPP の Web管理画面です。

とりあえず、最低限のセキュリティ設定を行なうため、左のメニューから「セキュリティ」をクリックします。

 
XAMPP 導入手順(13)

現在のセキュリティ関連の状態がどうなっているか、一覧で簡単に教えてくれます。
ほとんどの項目が「要注意」になっているかと思います。

そのテーブルの下に http://localhost/security/xamppsecurity.php へのリンクがあるので、それをクリック。

 
XAMPP 導入手順(14)

MySQL の root のパスワードを設定するフォームと、XAMPP の Web管理画面に .htaccess で Basic認証を設定するフォームの二つが表示されます。

とりあえず、まずは MySQL の root のパスワードを設定しましょう。

任意のパスワードを入力し、phpMyAdmin の認証方法(初期設定では Cookie)を選択。

フォーム下部のチェックボックスにチェックを入れると、設定したパスワードを、自動でテキストファイルに保存しておいてくれます。
まあ、その行為自体がセキュリティ的にどうなんだ、的な感じではありますので、その辺はお好みで。

そして「パスワードを変更しました」というボタンをクリック。

 
XAMPP 導入手順(15)

MySQL の root のパスワードを正常に設定できれば、「root のパスワードを変更しました。設定を有効にするために、MySQL を再起動してください。」と表示されます。

 
XAMPP 導入手順(16)

XAMPP のコントロールパネルを再度開きます。

MySQL が「起動」状態になっているはずなので、一旦「停止」ボタンをクリックします。

 
XAMPP 導入手順(17)

MySQL の「起動」状態が消えます。

再び「開始」ボタンをクリックして「起動」状態に戻します。

これで MySQL の再起動は完了。

 
XAMPP 導入手順(18)

再び、XAMPP の Web管理画面のセキュリティ設定フォームの方に戻ります。

次は、Web管理画面に .htaccess で Basic認証をかけるための設定を行ないます。

Basic認証については、「.htaccessによるBasic認証のかけ方」「.htaccess で特定のファイルのみにBasic認証を設定する方法」等も参考になれば。

フォームに、Basic認証に利用するユーザー名とパスワードを入力します。

MySQL の root のパスワードを設定した際と同様に、チェックボックスにチェックを入れると、ユーザー名とパスワードをテキストファイルに保存してくれますが、こちらもお好みで。

入力したら「安全な XAMPP ディレクトリを作成してください」というボタンをクリック。

 
XAMPP 導入手順(19)

「成功: XAMPP ディレクトリ制御が成功しました! 全ユーザのデータは、以下のファイルに格納されました:」と表示されたら、設定完了です。

 
XAMPP 導入手順(20)

以後、XAMPP の Web管理画面にアクセスすると、左記画像のように、Basic認証のダイアログが出るようになります。

とりあえず、これで最低限の設定は完了です。

 

なお、 XAMPP をインストールしたフォルダ内に「htdocs」というフォルダが作られています。
このフォルダ内にファイルを放り込めば、「http://localhost/***.html」等の URI でアクセスできます。

ブックマークに追加する
関連するブログ記事
スポンサード リンク
カテゴリー
MySQL | PHP | Web制作技術
タグ
.htaccess | Apache | Basic認証 | FileZilla | FTP | Mercury | MySQL | PHP | phpMyAdmin | SMTP | Windows | XAMPP | アクセス制限 | オープンソース

コメント(0) | トラックバック(0)

 

fgetcsv()関数について

2007年12月 5日 11:37 fgetcsv()関数について

本日も旧ブログからの転載です。

PHP の fgetcsv 関数に関するエントリーですが、2年半ほど前に書いたものなので、現状の PHP のバージョンではまた色々と違ってくるかもしれません。

もう fgetcsv 関数は全然使わなくなったので、現状でどういう挙動なのかはさっぱり知りませんが、まあ何かの参考になれば。


データ群を、特定の文字を区切りとしてcsv形式で保存し、phpから取り出すことはよくあると思うのですが、そういう時に便利なのが fgetcsv()関数。
が、この関数はphpのバージョンによって微妙に挙動が違ったりするようなので、適当に使ってると別のサーバーで同じスクリプトを使うと痛い目に遭ったりします。

array fgetcsv ( resource handle, int length [, string delimiter [, string enclosure]])

fgets()に動作は似ていますが、 fgetcsv()は行をCSVフォーマッ トのフィールドとして読込み処理を行い、読み込んだフィールドを含む 配列を返すという違いがあります。フィールドのデリミタは、オプショ ンの3番目のパラメータで別のデリミタを指定した場合を除きカンマです。 また、オプションの enclosure (フィールド囲い子) パラメータは、別の文字を4番目のパラメータで 指定しない限り、デフォルトではダブルクォーテーショーンマークとなります。 enclosuredelimiter はそれぞれ1文字に限られており、もし1文字を超える文字列が指定された場合は、 最初の文字だけが使われます。

日本PHPユーザ会マニュアル内「fgetcsv」の頁より。

つまり、ファイルを一行ずつ読み込んで、特定の区切り文字でsplitして、という作業をこの関数が一発で済ましてくれるわけです。

ここでまず重要なのは最後の「enclosuredelimiter はそれぞれ1文字に限られており、もし1文字を超える文字列が指定された場合は、 最初の文字だけが使われます。」という一文。
フィールドの区切りは1文字に限定されますので、perlのcgiなんかでよく使われていた(orる)「<>」を区切りに使う手法は使えません。
カンマ「,」区切りとか、タブ「\t」区切りとかを使いましょう。
「もし1文字を超える文字列が指定された場合は、 最初の文字だけが使われます。」とありますが、「\t」を「\」と「t」の二文字として判断したりはしません。

次に、「enclosure (フィールド囲い子) パラメータは、別の文字を4番目のパラメータで 指定しない限り、デフォルトではダブルクォーテーショーンマークとなります。」という一文。
私はマニュアルを良く読まずに「enclosureを指定しなければ、フィールドの囲い子は「ない」として扱われると思いこんでいたため(そしてうちのサーバーではそれで問題なく動いてしまっていた)、そのスクリプトを他所様のサーバーで動かすと大量に文字化けが発生してしまいました。

この件の場合、fgetcsv()を使っている箇所は何も弄らずに、データ自体の各フィールドをダブルクォーテーションで括るようにしたところ、無事に意図通りの挙動をするようになりました。

とは言え、enclosureを指定せず、データの囲い子がない状態でもうちのサーバーだとちゃんと区切ってくれたと言うことは、逆にenclosureをちゃんと指定しておかないとどういう挙動をするかわからない、という可能性もあるわけで。
というわけで、このfgetcsv()関数を使う際、enclosuredelimiterは省略可能なオプションとして設定されていますが、必ず指定した方が良さそうです。
また、色々ぐぐってみたところ「fgetcsv()関数はあてにならない」というような意見も結構見受けられましたので、使いどころには気をつけた方が良さそうです。

ブックマークに追加する
関連するブログ記事
カテゴリー
PHP
タグ
fgetcsv | PHP

コメント(0) | トラックバック(0)

 

phpPgAdmin導入メモ

2007年12月 3日 02:02 phpPgAdmin導入メモ

今回も旧ブログから記事を引っ張ってきました。

2年半以上前の記事ですが、まあ何かの参考にはなるかな、と。

というわけで、以下は過去に使っていたレンタルサーバーでの phpPgAdmin のインストール手順のメモです。


1. はじめに

phpPgAdminは、PostgreSQLデータベースをGUIで操作するためのWebアプリケーションです。名前の通り、プログラム本体はPHPで記述されていますので、PHPの動作する環境でないと使えません。

このphpPgAdminのことは以前から知っていたのですが、今までSSHでサーバーにログインしてコマンドラインからpsqlを起動しての管理に特に不便を感じていなかったことと、インストールがめんどくさそう、という理由から導入は見送っていました。

が、つい先日別のWebサーバーでphpPgAdminを使う機会があって、その想像以上の操作の便利さに導入を決めました。
以下はこのサイトで使っているレンタルサーバーでのphpPgAdmin 3.5.3の導入手順です。

※ちなみに、同じようにPHPで記述されたMySQL管理用のWebアプリケーション「phpMyAdmin」というのもあります(というかこっちの方が有名かも)。

2. phpPgAdminのダウンロード

phpPgAdmin公式サイトより、ソースコード本体をダウンロードします。


3. config.inc.php の編集

ダウンロードしたファイルを解凍し、 conf/ ディレクトリを開きます。
config.inc.php-dist というファイルがあるので、同一ディレクトリ内に config.inc.php という名前でこれのコピーを作ります。
※config.inc.php-dist は設定ファイルのデフォルトの状態が記述されたファイルなので、万が一のために残しておく方が良いかと思われます。

コピーした config.inc.php をテキストエディタで開き、下記のように編集しました。

// データベース名を自分の使用しているものに変更
$conf['servers'][0]['defaultdb'] = 'template1';
  ↓
$conf['servers'][0]['defaultdb'] = 'amethyst';

// 画面に表示される言語を英語から日本語に変更
$conf['default_lang'] = 'english';
  ↓
$conf['default_lang'] = 'japanese';

// レンタルサーバーを利用しているため、他のユーザーアカウントのDBが見えてしまうと
// 邪魔&色々困るのでownerが私になってるものだけ表示するように設定
$conf['owned_only'] = false;
  ↓
$conf['owned_only'] = true;

4. ひたすらアップロード

編集した config.inc.php を含む全ファイルをアップロードします。


5. Basic認証の設定

自分以外の人間にphpPgAdminでDBをいじられるととっても困るので、phpPgAdminをインストールしたディレクトリにBasic認証をかけておきます。
Basic認証のかけ方は.htaccessによるBasic認証のかけ方等を参照。


6. 動作確認

phpPgAdminをインストールしたディレクトリの index.php にアクセスします。
ログインフォームが表示されるので、PostgreSQLのユーザー名とパスワードを入力し、ログインできればインストールは正常に完了しているかと思われます。

後はお好きなように。

ブックマークに追加する
関連するブログ記事
カテゴリー
PHP | PostgreSQL
タグ
.htaccess | Basic認証 | CMS | PHP | phpPgAdmin | PostgreSQL | RDBMS

コメント(0) | トラックバック(0)

 

perl の CGI や PHP でファイルをアップロードする方法

フォームからファイルをアップロードして、そのファイル自体をサーバーに保存したり、あるいはファイルの内容をデータベースに反映したりするようなスクリプトも、作る機会がかなり多いので、手順をメモしておきます。

フォームの html

ファイルをアップロードさせるフォームの場合、通常の form 要素とは違って、enctype 属性をつける必要があります。

<form method="POST" action="upload.cgi" enctype="multipart/form-data">
  <!-- ここにフォームの内容が入る -->
  <input type="file" name="uploadfile" value="" size="20" />
  <input type="submit" value="アップロード" />
</form>

enctype 属性の他に注意する点としては、必ず POST メソッドを指定することが挙げられます。
GET メソッドではファイルのアップロードはできません。

アップされたファイルの受け取り方 (perl の場合)

僕自身は昔、まだ CGI.pm が perl の標準モジュールじゃなかった頃に作ったコードで、アップされたファイルの内容を受け取る処理をすることが多いですが、今は CGI.pm が標準モジュールとして最初から入っているので、これを使うのが手っ取り早いでしょう。

下記サイトが参考になります。

アップされたファイルの受け取り方 (PHP の場合)

PHP の場合は、非常に簡単です。
定義済変数 $_FILES に、アップロードされたファイルの情報が自動的に入ります。

例えば、

<form method="POST" action="upload.cgi" enctype="multipart/form-data">
  <input type="file" name="uploadfile" value="" size="20" />
</form>

のように、アップロードするファイルの入力欄の名前を uploadfile とした場合、変数 $_FILES は以下のように参照できます。

$_FILES['uploadfile']['name']
元のファイル名
$_FILES['uploadfile']['type']
ファイルの MIME-Type
$_FILES['uploadfile']['size']
ファイルのサイズ (バイト単位)
$_FILES['uploadfile']['tmp_name']
アップロードされたファイルのテンポラリ(一時)ファイルの名前(パス)

後は、サーバー上でファイルを保存するなら、 $_FILES['uploadfile']['tmp_name'] をどこかにコピーすれば良いし、ファイルが CSV 等で、その中身を見て何らかの処理をするなら、$_FILES['uploadfile']['tmp_name'] を開いて中身を読めば良いわけです。

ブックマークに追加する
関連するブログ記事
カテゴリー
PHP | perl/CGI
タグ
CGI | CGI.pm | enctype属性 | form要素 | input要素 | MIME | perl | PHP | xhtml | アップロード

コメント(0) | トラックバック(0)

 

SEO対策として使われる、perl の CGI や PHP に GET で渡す値を「/」(スラッシュ)で区切る方法

よく「CGI や PHP は SEO に不利だ!」なんてことが言われますが、これは技術的なことをよく理解していない人に向けて、難しいことを極端に省略した説明なので、大きな誤解を孕んでいます。

正確には、

http://www.abe-tatsuya.com/aaa.cgi?v1=bbb&v2=ccc

のようなURIの、CGI や PHP に値を GET メソッドで渡す「?v1=bbb&v2=ccc」といった部分が問題なわけです。
こういった値を渡さない、シンプルな URI であれば、拡張子が何であろうが関係はないはずです。

なので、逆に CGI や PHP でなく、拡張子が .html であっても、

http://www.abe-tatsuya.com/aaa.html?v1=bbb&v2=ccc

のような URI なら、同様に検索エンジン側から「これは動的なURIだ」と判断されて、低く評価されるはずです。
(アクセス解析目的とか、ページ側で JavaScript 等で何かの処理をする際に、こういう手法を取ることはあり得ますよね)

で、そういった CGI や PHP 等に、GET メソッドで値を渡した結果によって表示する内容を変えるようなコンテンツの場合、検索エンジンから低く評価されることを避けるために、下記のような URI で処理することが多いです。

http://www.abe-tatsuya.com/aaa/bbb/ccc

最初の例との違いは、以下の通りです。

  1. 「aaa.cgi」の拡張子「.cgi」がない
  2. 「ここからが GET メソッドで渡す値ですよ」という意味の記号「?」がなく、代わりに「/」で区切っている
  3. GET メソッドで渡す値の名前(「v1=」「v2=」)がない
  4. GET メソッドで渡す値の区切りの記号「&」がなく、代わりに「/」で区切っている

これで、一見して動的な URI ではなく、単なるディレクトリ内にあるファイルの URI のように見せることができるわけです。

これを実現するためにやらないといけないことは、

  1. 「aaa」という拡張子のないファイルが、CGI または PHP のスクリプトであることをサーバーに教えてあげる
  2. 「aaa」のスクリプト内で、「/」区切りで渡される値を受け付ける処理を書く

大きく分けて、この二点です。

拡張子のないファイルを CGI や PHP として動作させる方法

「aaa」のような拡張子のないファイルを、CGI または PHP として動作させるには、.htaccess を使います。

特定のファイルに対するアクセス制限や、.htaccess で特定のファイルのみにBasic認証を設定する方法の応用で、

<Files aaa>
ForceType cgi-script
</Files>

と書けば、「aaa」というファイルが CGI として実行されます。

PHP として実行したい場合は、

<Files aaa>
ForceType application/x-httpd-php
</Files>

と書けば、「aaa」というファイルが PHP として実行されます。

perl の CGI や PHP で、「/」(スラッシュ)で区切られた値を受け取る方法

とりあえず「aaa」のようなファイル名のスクリプトが動くようになりました。
次は「/bbb/ccc」のような、一見ただのディレクトリへのリクエストのように見える URI を、スクリプトに渡される値として処理するための方法です。

これには、環境変数 PATH_INFO を参照します。

例えば、perl の CGI である「http://www.abe-tatsuya.com/aaa」に対して、「/bbb/ccc」という値を渡す、つまり、「http://www.abe-tatsuya.com/aaa/bbb/ccc」という URI にアクセスさせる場合、「aaa」というスクリプトの中で、$ENV{'PATH_INFO'}を参照すると、その内容は「/bbb/ccc」となります。

なので例えば、「aaa」という CGI スクリプトの最初のほうに、

#-- PATH_INFO を「/」で分けて配列に格納
@params = split(/\//,$ENV{'PATH_INFO'});
shift(@params);

等とすれば、$params[0],$params[1]... の順番に、「/」区切りで渡された値が入ります。

PHP の場合は、$_SERVER['PATH_INFO']を参照すれば、同様に処理できます。

// PATH_INFO を「/」で分けて配列に格納
$params = split("/",$_SERVER['PATH_INFO']);
array_shift($params);

これで、perl と同様に、$params[0],$params[1]...の順番に、「/」区切りで渡された値が入ります。

後は、渡された値に応じて、出力内容を変えるように色々とスクリプトを書けば OK です。

ブックマークに追加する
関連するブログ記事
カテゴリー
.htaccess | PHP | SEO(検索エンジン最適化) | perl/CGI
タグ
.htaccess | CGI | ForceType | GETメソッド | PATH_INFO | perl | PHP | SEO | 環境変数

コメント(0) | トラックバック(1)

 

PHP でファイルの MIME-Type を判別する方法

相変わらず、perlやPHPでファイルのダウンロード確認ダイアログを表示させる方法と、その関連記事であるperl の CGI や PHP でよく出力する Content-type ヘッダ一覧 (MIME-type)へのアクセスが、うちのブログでは毎日アクセス上位2位を占めているので、さらに補完エントリーを書いてみます。

ファイルをダウンロードさせるスクリプトを書く際に、最初からそのファイルの MIME-Type が解っている場合は良いのですが、色んな種類のファイルをひとつのスクリプトでダウンロードさせる場合には、各ファイル個別に MIME-Type を判別して、Content-type ヘッダとして出力する必要があります。

perl の場合は多分、自分で MIME-Type 判別用の関数を作るとか、何らかのモジュールを使うとか、perl スクリプトから file コマンドとかそれに類する UNIX コマンドを呼び出すとかしないと無理なんじゃないかと思うんですが、PHP の場合は非常に簡単で、mime_content_type() という関数一つで事足りるようです。

// MIME-Typeを判別したいファイル
$source = '/home/tatsuya/data/img/00003.jpg';

// MIME-Type を判別
$mime_type = mime_content_type($source);

これで、「$mime_type」に、指定したファイルの MIME-Type が代入されます。

なので、perlやPHPでファイルのダウンロード確認ダイアログを表示させる方法で書いたようなダウンロードスクリプトを書く場合には、

// ダウンロードさせる元ファイル
$source = '/home/tatsuya/data/img/00004.jpg';
// MIME-Type を判別
$mime_type = mime_content_type($source);
// 保存時のファイル名
$filename = 'kagaminerin.jpg';

// HTTP ヘッダ送信
header("Content-type: {$mime_type}");
header("Content-Disposition: attachment; filename=\"{$filename}\"");
// ファイルを読み込んで出力
readfile($source);

こんな感じになります。

後は、GET や POST で受け取った値を元に $source$filename を変える処理を事前に作っておけばOKでしょう。

mime_content_type() 関数についての注意事項

PHP マニュアルの mime_content_type の項目を見ると、以下のように書いてあります。

この関数は非推奨です。PECL 拡張モジュール Fileinfo が、同等の機能 (それ以上のもの) をもっときれいな方法で提供しています。

ですので、PECL 拡張モジュールをインストールできる権限がある場合や、既にサーバーに Fileinfo 拡張モジュールが入っている場合は、この finfo_file 関数を使って MIME-Type を判別した方が良いかと思います。

ブックマークに追加する
関連するブログ記事
カテゴリー
PHP
タグ
Content-Disposition | Content-type | Fileinfo | finfo_file | HTTPヘッダ | MIME | mime_content_type | PECL拡張モジュール | PHP | RFC | ダウンロード

コメント(0) | トラックバック(0)

 

perl の CGI や PHP でよく出力する Content-type ヘッダ一覧 (MIME-type)

ここ数日、perlやPHPでファイルのダウンロード確認ダイアログを表示させる方法へのアクセスが、すば抜けて多いです。

こういうスクリプトを書こうとしている人って多いんでしょうか。

なので、件のエントリーの補完ということで、今回は perl の CGI や PHP で個人的によく出力する or 今後出力する機会がありそうな Content-type ヘッダをまとめておきます。
まとめとけば自分が後で一番楽だし。

テキスト・文書・MSオフィス関連

ファイルの種類 拡張子 MIME-Type
テキスト文書 .txt text/plain
CSVファイル .csv text/csv
TSVファイル .tsv text/tab-separated-values
ワード文書 .doc application/msword
エクセルシート .xls application/vnd.ms-excel
パワーポイント .ppt application/vnd.ms-powerpoint
PDF文書 .pdf application/pdf
Docuworks .xdw application/vnd.fujixerox.docuworks
HTML文書 .html .htm text/html
スタイルシート .css text/css
JavaScriptファイル .js text/javascript
HDML文書 .hdml text/x-hdml

画像関連

ファイルの種類 拡張子 MIME-Type
JPEG .jpg .jpeg image/jpeg
PNG .png image/png
GIF .gif image/gif
ビットマップ .bmp image/bmp
イラストレーター .ai application/postscript

音声関連

ファイルの種類 拡張子 MIME-Type
MP3 .mp3 audio/mpeg
MP4 .m4a audio/mp4
WAV .wav audio/x-wav
MIDI .mid .midi audio/midi
SMAF .mmf application/x-smaf

動画関連

ファイルの種類 拡張子 MIME-Type
MPEG .mpg .mpeg video/mpeg
WMV .wmv video/x-ms-wmv
Flash (Shockwave) .swf application/x-shockwave-flash
3GPP2 .3g2 video/3gpp2

圧縮ファイル関連

ファイルの種類 拡張子 MIME-Type
ZIP形式 .zip application/zip
LZH形式 .lha .lzh application/x-lzh
tar / tar+gzip形式 .tar .tgz application/x-tar

その他

ファイルの種類 拡張子 MIME-Type
実行ファイル .exe application/octet-stream

perl なら出力の一番最初に、

print qq|Content-type: MIME-Type\n|;

PHPなら出力の一番最初に、

header("Content-type: MIME-Type");

とやれば良いわけです。

ブックマークに追加する
関連するブログ記事
カテゴリー
PHP | perl/CGI
タグ
CGI | Content-type | HTTPヘッダ | MIME | perl | PHP | RFC | ダウンロード

コメント(0) | トラックバック(2)

 

Yahoo!モバイルのjigブラウザ機能の問題点と、perlとPHPでのjigブラウザのUser-Agent振り分け方法

「ケータイでPCのサイトが閲覧できる!」という謳い文句の割に、所謂「フルブラウザ」と比較しても機能的に中途半端で(特にJavaScript非対応はイタい)、個人的にはあんまり使い物にならないと思っている jigブラウザ。

同一URLで、User-Agentを元にして、ケータイとPCを自動で振り分ける際に、jigブラウザをPCサイト側に振り分けると、サイトの構成によっては、あまりいただけないことになってしまいます。

特に問題なのが、ケータイ版のYahoo!検索「Yahoo!モバイル」で検索した際に「PCサイトとの一致」でヒットしたサイトは、自動的にjigブラウザで表示されてしまうこと。

Yahoo!モバイルのインデックスが微妙なせいで、ケータイサイトとPCサイトを同一URLで公開していると、「携帯サイトとの一致」ではヒットしないけど「PCサイトとの一致」ではヒットする、みたいなことも起こりうるんですよね。

「PCサイトとの一致」でヒットしたサイトを、自動でjigブラウザで表示するのは基本的には便利な機能なんですが……。
こっちはちゃんとケータイに合わせた仕様でのサイトを提供しているんだから、わざわざ中途半端な機能しかないjigブラウザでPCサイト見るくらいなら、普通にケータイ用のブラウザでケータイ向けサイトを見てもらった方が、まともにサイト内のコンテンツを利用することができるわけです。

そういうわけで、jigブラウザからのアクセスの場合は、それを判別して、サイト内に注意書きを自動で入れるとか、そもそもjigブラウザでもケータイ向けサイトを表示するようにするとか、そんな対処が必要になります。

「Yahoo!モバイル」等で提供されている「jigブラウザ WEB」のデフォルトのUser-Agentは、

Mozilla/4.0 (jig browser web; version; 機種名

という感じです。
version」はjigブラウザのバージョン。「1.0.4」みたいな数字が入る。
機種名」は利用している携帯の機種名。「F904i」「812SH」みたいなのが入る。

なのでとりあえず、User-Agent内に「jig browser web」が含まれている場合はjigブラウザだと判断して、何らかの処理をするのが手っ取り早いかと思います。

perlなら、

if($ENV{'HTTP_USER_AGENT'} =~ /jig browser web/){
	#-- ここにjigブラウザの場合の処理
}

PHPなら、

if(preg_match("/jig browser web/",$_SERVER['HTTP_USER_AGENT'])){
	// ここにjigブラウザの場合の処理
}

こんな感じで。

ちなみに、GoogleもPCサイトの検索結果に出たサイトを携帯で見る場合、独自のブラウザを介して表示しますが、こっちは未調査です。
そのうち調べます。

ブックマークに追加する
関連するブログ記事
カテゴリー
PHP | perl/CGI | モバイル(携帯電話・ケータイ)Web
タグ
jigブラウザ | perl | PHP | User-Agent | Yahoo!モバイル | YST | モバイル | 環境変数

コメント(0) | トラックバック(0)

 

perlやPHPでファイルのダウンロード確認ダイアログを表示させる方法

perlやPHPを使って、ユーザーにWebブラウザから何らかのファイルをダウンロードしてもらうスクリプトというのは、作る機会も結構多いかと思います。

しかし、ダウンロードしてもらうファイルがjpegやpng、gif等の画像ファイルだったり、PDFやワード・エクセル等のファイルだったり、音声や動画ファイルだったり等、ブラウザでそのまま閲覧できるファイルだった場合、ローカルにダウンロードするダイアログが出ずに、そのままブラウザに表示されてしまうことがよくあります。

そういう場合、「『右クリック⇒対象をファイルに保存』でローカルに保存できます」なんて注意書きをつけて、そのCGIやPHPスクリプトにリンクを張ることも多いかもしれませんね。

この現象は、CGIやPHPからブラウザに送信するHTTPヘッダを少し変えることで、避けることが可能です。
(ただし、ブラウザによっては駄目かも……)

具体的には、以下のようなHTTPヘッダを送信します。

Content-Disposition: attachment; filename="sample.jpg"

sample.jpg」の部分には、ファイルのダウンロードダイアログにデフォルトで表示される、保存先ファイル名を指定します。

これを踏まえて、perlである特定のjpeg画像を、ダウンロード確認ダイアログを表示させてダウンロードさせる場合は、以下のようになります。

#-- ダウンロードさせる元ファイル
$source = '/home/tatsuya/data/img/00001.jpg';
#-- 保存時のファイル名(デフォルト)
$filename = 'uetoaya.jpg';

#-- HTTPヘッダ送信
print qq|Content-type: image/jpeg\n|;
print qq|Content-Disposition: attachment; filename="$filename"\n|;
print qq|\n|;
#-- ファイルを読み込んで出力
open(FILE,"$source");
while(<FILE>){print;}
close(FILE);

PHPの場合は、以下のような感じ。

// ダウンロードさせる元ファイル
$source = '/home/tatsuya/data/img/00002.jpg';
// 保存時のファイル名(デフォルト)
$filename = 'aibusaki.jpg';

// HTTPヘッダ送信
header("Content-type: image/jpeg");
header("Content-Disposition: attachment; filename=\"{$filename}\"");
// ファイルを読み込んで出力
readfile($source);

何らかのWebアプリケーションのバックアップデータなんかをダウンロードする場合とかは、保存時のファイル名を「ダウンロード時の日付.txt」みたいな感じにするようにしとくと便利かもですね。

ブックマークに追加する
関連するブログ記事
カテゴリー
PHP | perl/CGI
タグ
CGI | Content-Disposition | Content-type | HTTPヘッダ | perl | PHP | ダウンロード

コメント(0) | トラックバック(0)