[[OpenPNE 2.12 カスタマイズ]]
&lastmod;
#contents
----
*OpenPNE 2.12 カスタマイズ upload容量編 [#k5f2e9e0]
デフォルトのデータアップロードは300kbの制限であるが、メガピクセルのデジカメ画像などはつらいものがあるので、制限容量をアップする。

http://bestpc.s153.xrea.com/pukiwiki/pukiwiki.php?%C5%BA%C9%D5%A5%D5%A5%A1%A5%A4%A5%EB%A4%CE%CD%C6%CE%CC

OpenPNE2.0で、画像などのファイルを添付する場合に、ファイルサイズの上限がどこで決まるか?調査しました。

**添付ファイルの処理の流れ † [#o8492d04]
OpenPNE2.0では、日記やコミュ二ティ掲示板でメッセージに画像ファイルを添付することができます。

アップロードされた画像ファイルは、

ファイル形式(拡張子)とファイルサイズをチェックしてOKであれば、 
BASE64方式でエンコード(データの変換)して、 
データベース(MySQL)に保存します。
 /openpne/webapp/lib/db/write/image.php
の
db_image_insert_c_image関数内で、BASE64方式エンコード実行

base64_encode()を使うとデータサイズは、4/3倍になります。(33%増し)

例)75KBの画像ファイルなら、100KBの文字列に変換されます。

変換後のデータを、MySQLのc_imageテーブルにあるLONGBLOB型カラムに保存します。


**OpenPNEの設定 [#h200c5b5]
OpenPNEの設定ファイルで、添付ファイルのサイズ上限を指定します。

 /openpne/config.php
の200行目付近にある

 // アップロード画像のファイルサイズ制限(KB)
 define('IMAGE_MAX_FILESIZE', 1024);
で、定数「IMAGE_MAX_FILESIZE」の値を指定します。
単位はキロバイト(KB)となっています。

例)10240と指定した場合、10240KB=10MBまでOKとなります。

**PHPの設定 [#zecd2aaf]
WebサーバのPHP設定で、ブラウザーからWebサーバに対して転送できるデータ容量が指定されています。

phpinfo()関数
で、PHPの設定を確認します。

例)以下のようなPHPスクリプトを、phpinfo.phpのようなファイル名で保存して、ブラウザで表示させます。

 <?php
 phpinfo();
 ?>PHP
の設定項目(ディレクティブ)がズラズラ表示されるので、以下の3項目をチェックします。

|Directive|Local Value|Master Value| |
|memory_limit |128M|128M|スクリプトが確保できる最大メモリをバイト数で指定します|
|post_max_size | 8M| 8M|POSTデータに許可される最大サイズを設定します。|
|upload_max_filesize|2M|2M|アップロードされるファイルの最大サイズ|

(参考)PHP の設定を行うための php.ini ディレクティブ
http://jp.php.net/manual/ja/ini.php
***PHPの設定ファイルの位置を確認 [#t088b419]
 ns# /usr/local/bin/php -i | grep -i configuration
 Configuration File (php.ini) Path => /usr/local/etc
 Loaded Configuration File => /usr/local/etc/php.ini
 Configuration
 ns#
***PHPの設定ファイルを作る [#j5629944]
デフォルト以外の部分をphp.iniとして記述する
 # touch /usr/local/etc/php.ini
 # vi /usr/local/etc/php.ini

 [PHP]
 
 ; Maximum size of POST data that PHP will accept.
 post_max_size = 12M
 ; Maximum allowed size for uploaded files.
 upload_max_filesize = 10M
として、設置。
 # apachectl restart
して、設定を反映する。phpinfo.php で確認


|memory_limit|128M|
|post_max_size|12M|
|upload_max_filesize|10M|

memory_limit ≧ post_max_size ≧ upload_max_filesize
という大小関係で設定されています。

WebサーバのPHP設定で、upload_max_filesize のサイズより大きなファイルは、OpenPNEからアップロードできません。 
upload_max_filesize で指定してあるサイズより、小さなサイズを上記のOpenPNEの設定で指定する必要があります。 
OpenPNEで容量の大きなファイルを添付したい場合は、PHPの設定を変更(php.iniファイルを書換え)して、upload_max_filesize を大きな値にすればOKです。

※レンタル共用サーバを使っている場合、レンタル会社のセキュリティポリシーによって、PHP設定を変更できないこともあるかと思われます。

**データベースの設定 [#yf7c93fc]
アップロードされた添付ファイルは、データベースに保存する前に、OpenPNEによってBASE64方式でエンコードされます。

(データベースに保存するときのデータサイズは、元の添付ファイルの4/3倍になっている点に注意してください。)

そして、Webサーバ(OpenPNE)から、データベースサーバ(MySQL)へデータを転送して保存します。

このとき、データベース側の設定によって、転送できるデータのサイズ上限が決められています。

この上限よりも大きなサイズのデータをデータベースに送りつけると、データベース側で受取を拒否します。

=データの保存に失敗

=添付ファイルのアップロードに失敗


**MySQLのメッセージバッファサイズ [#vaf5987b]
 max_allowed_packet
Webサーバ(クライアント)とデータベース(サーバ)間で送信できる最大値は、
データベースで使用可能なメモリ量と、
通信バッファのサイズ(max_allowed_packet)で決まります。

**max_allowed_packetの確認 [#of667d60]
MySQLの設定変数のうち、max_allowed_packetを設定
/usr/local/etc/my.conf
 max_allowed_packet = 16M
 
 ns# /usr/local/etc/rc.d/mysql-server restart
 Stopping mysql.
 Waiting for PIDS: 964.
 Starting mysql.
 
 ns# mysql --help  を実行して、設定を確認する。
 
(参考)


BLOB型について

http://dev.mysql.com/doc/refman/4.1/ja/blob.html

サーバパラメータについて

http://dev.mysql.com/doc/refman/4.1/ja/server-parameters.html

SHOW VARIABLESについて

http://dev.mysql.com/doc/refman/4.1/ja/show-variables.html

**その他の要素 [#d6764074]
インターネットの回線が遅いと、ファイルのアップロード処理に時間がかかり、処理の途中でWebサーバがデータ受付を中断することもあるかもしれません。

ファイルのアップロードに失敗する場合は、インターネットの回線速度や、Webサーバが処理を中断する時間をチェックする必要があるかもしれません。

**まとめ [#p8087276]
アップロードできる添付ファイルの容量は、

-OpenPNEの設定 
-PHPの設定 
-MySQLの設定
の三つで決まります。

ファイルのアップロードに失敗する場合はチェックしてみましょう。
*OpenPNE 2.12 カスタマイズ ファイルアップロード機能編 [#s1150f41]
ファイルアップロード機能を有効にするには、/OpnePNE_DIR/config.phpの該当箇所を
 ///
 // ファイルアップロード機能
 ///
 
 // ファイルアップロード機能を使用するかどうか
 //define('OPENPNE_USE_FILEUPLOAD', false);
 define('OPENPNE_USE_FILEUPLOAD', true);
 // アップロードファイルのファイルサイズ制限(KB)
 //define('FILE_MAX_FILESIZE', 300);
 define('FILE_MAX_FILESIZE', 10000);
 // 許可する拡張子のリスト(カンマ(,)区切り)
 // 未指定の場合は全て許可
 //define('FILE_ALLOWED_EXTENTIONS', 'pdf,xls,ppt,zip');
 define('FILE_ALLOWED_EXTENTIONS', 'pdf,xls,ppt,zip,jpg,png,gif,psd');
の様に編集します。
この機能は、コミュニティのトピックのところに実装されています。つまりコミュニティでのファイル共有のためという位置づけです。
コミュニティを作って、トピックを追加する画面で、画像を添付するところの下に、ファイルを添付するEditBoxが出てきます。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS