NetCommons2で構築しているサイトでアップロードしたWordファイルをダウンロードするとファイルが開けないという事象が発生したので調査しました。その備忘録です。
手始めにダウンロードしたWordファイルをテキストエディタで開き、ファイルの最後にあるエラーメッセージを確認しました。
[PHP_Notice]: ob_flush() [ref.outcontrol]: failed to flush buffer. No buffer to flush in file /[Install Directory]/webapp/components/uploads/View.class.php
どうやらob_flush()で失敗しているようです。。。
ob_flush()は http://php.net/manual/ja/function.ob-flush.php によると出力バッファをフラッシュ(送信)するということでした。
ob_flush()で出力バッファをフラッシュするにはob_start()を呼んで出力バッファを開始する必要があります。
当該のView.class.phpではob_start()は呼ばれていないようですが、きっとどこかで呼ばれているんでしょう。
(以前はWordファイルを開くことができていたので、サーバのPHP設定によって通るルートが変わった可能性があります)
ということでob_start()が呼ばれているかどうかをチェックし、呼ばれていればob_flush()を行うように修正しました。
●修正ファイル
[Install Directory]/webapp/components/uploads/View.class.php
(NetCommons2.4.2.1では319-323行目)
●修正前
while (!feof($handle)) { echo fread($handle, 1 * (1024 * 1024)); ob_flush(); flush(); }
↓
●修正後
while (!feof($handle)) { echo fread($handle, 1 * (1024 * 1024)); if( ob_get_level() > 0 ) ob_flush(); flush(); }