「WEBアプリケーション」カテゴリーアーカイブ

PHPでファイルアップロードするとき…

文字コードがSJISだと、ファイル名に「ソ」とか「表」などの0x5c(\)を含む文字があると文字化けしますよね。

こういうときはファイル名だけ別のフォームデータとして送れば文字化けしていないファイル名を使用することができます。

以下はサンプル。

—————————————–
a.php

<html>
<head>
<script type=”text/javascript”>
function saveFilename()
{
document.all.upldfilename.value = document.all.upldfile.value;
}
</script>
</head>
<body>
<form enctype=”multipart/form-data” method=”post” action=”b.php” onsubmit=”saveFilename();”>
<input type=”file” name=”upldfile” id=”upldfile”>
<input type=”hidden” name=”upldfilename” id=”upldfilename”>
<input type=”submit”>
</form>
</body>
</html>
—————————————–
b.php

<html>
<head>
</head>
<body>
<p>オートグローバル$_FILESでは文字化けする</p>
<p>
<?php
echo $_FILES[‘upldfile’][‘name’];
?>
</p>

<p>こちらは文字化けしない</p>
<p>
<?php
echo mb_substr($_POST[‘upldfilename’], mb_strrpos($_POST[‘upldfilename’], “\\”)+1);
?>
</p>
</body>
</html>
—————————————–

php.ini とかで文字化けしない方法があるんじゃないかと思って何時間か調べたけど、見つからなかったのでこの方法で逃げました。

Tomcat で PHP

Tomcat で PHP を動かす方法って知ってますか?Java の Servlet を動かす環境で PHP も動かすということです。

先日ちょっと調べる必要があったのでメモ代わりに書いておきます。

ここに書かれていることを設定すればよいのですが、、php のコンパイルは Apache のためでなく Tomcat のためにコンパイルするということを知っておかないとちょっとスタックしてしまうと思います。

どういうことかというと、Tomcat で php を動かすというのは Tomcat で php をサーブレットとして動かすということだからです。では設定方法を。

1. configure スクリプトの修正

configure スクリプト内でサーブレットのクラスパスを設定する部分があるのですが、これは Tomcat のバージョンによって異なります。具体的には…

if test -f $withval/lib/servlet.jar; then
SERVLET_CLASSPATH=$withval/lib/servlet.jar
fi

…という部分があるので自分が使っている Tomcat の設定を追加します。例えば…

if test -f $withval/common/lib/servlet-api.jar; then
SERVLET_CLASSPATH=$withval/common/lib/servlet-api.jar
fi

…というような行を追加します。

2. ビルド

./configure に –with-servlet=$TOMCAT_HOME –with-java=$JAVA_HOME を追加します。$TOMCAT_HOME と $JAVA_HOME は Tomcat と Java のディレクトリですので設定してあることを確認して下さい。

このとき Apache 用の –with-apx とか –with-apx2 を指定してはいけません。あとは Apache 用の php をビルドしたときと同じパラメータを指定すればよいと思います。
もちろん make だけで make install はしちゃだめですよ。

3. 設定

出来上がった sapi/servlet/phpsrvlet.jar を $TOMCAT_HOME/common/lib (バージョンごとに適宜読み替え) にコピーします。

次に sapi/servlet/web.xml を webapp の WEB-INF にコピーします。

最後に libphp4.so の場所の設定です。これは LD_LIBRARY_PATH に設定するか、元々 Java が探しに行くパスにコピーするかのどちらかです。

LD_LIBRARY_PATH=$PHP_HOME/libs
export LD_LIBRARY_PATH

…とするか…

cp $PHP_HOME/libs/libphp4.so $JAVA_HOME/jre/lib/i386

…のどちらか好きな方を選んでください。

これで後は Tomcat を起動したら php が動くはずです。

この php を Tomcat 用にコンパイルするということに気付かないと、Tomcat を起動して…
Undefined symbols: ap_block_alarms
…というようなエラーメッセージに悩まされることになります。