PHPでダウンロードするExcel、Wordが開けない

以前に開発したシステムで、ダウンロードしたExce、Wordが開けなくなったという連絡が来ました。

 

開けないファイル

Excelはファイルが破損していると表示され開けない

Wordも破損していると表示されるが「はい」をクリックすると開ける

どちらも以前は発生していなかったもの

既に5年以上前にリリースしてなにも問題なく運用していたものが突然ダメになったとのことなので詳細を確認するとサーバを移設したとのことでした

 

アップロード前後のファイルを調査

以前に開発したシステムの機能の1つに共有フォルダにおいたExce、Word、PDF、TXTらのファイルをFFFTPからサーバ上に自動アップロードし、

PHPで作られたWebファイル一覧からファイルをダウンロードできるようにするというものがあり、これでダウンロードしたファイルが開けないという状況でした。

そこで以下のような調査を実施

 ・アップロード前のファイルは開けるか? ・・・OK

 ・FFTPで自動アップロードされたファイルをFFFTPでダウンロードしたファイルは開けるか? ・・・OK

 ・サーバ移設前のファイルをWebファイル一覧でダウンロードして開けるか? ・・・NG

 ・サーバ移設前のファイルをFFFTPでダウンロードしてファイルは開けるか? ・・・OK

これらにより、Webからダウンロードしたファイルだけが開けなくなっている模様

 

ファイルサイズが違う

そこで、同じExcelファイルのアップロード前のファイルとアップロード後にWebからダウンロードしたファイルを調査するとファイルサイズが異なっていました

左がアップロード前、右がWebからダウンロード

 

バイナリエディタで両ファイルを開いてみると、Webからダウンロードしたファイルの先頭に「EFBBBF」が!

上がアップロード前、下がWebからダウンロード

BOMよお前か!

エディタ上で「EFBBBF」を削除してみると無事Excelが開けました。

 

ExcelにBOMが付いた理由

BOMとはいろいろ説明したサイトがありますのでここでは割愛しますが、秀丸、さくらエディタなどのテキストエディタで保存するときに「BOM付き」のような

チェックがあります、このチェックを入れて保存するとBOM付きになり、ファイルの先頭に先程の「EFBBBF」が付与されます。

 

そして、この「BOM付き」で保存されたPHPファイルからダウンロードしたファイルは、元のファイルにBOMが付いていなくてもBOM付きにされてダウンロードしてしまいます。

さらに言うと、ダウンロードの命令を書いているPHPファイルがBOM無しの場合でも、このファイル内で require や require_once  で取り込んだファイルがBOM付きの場合もBOM付きにされてしまい、そのファイル内で require していたらその先も・・・とういう感じです

 

今回は、ダウンロード処理が書かれたPHPファイルは「BOM無し」でした、その中で require_once で取り込んでいた common.php も「BOM無し」でした

しかし、common.php 内で require_once で取り込んでいた const.php が「BOM付き」になっていました。

 

サーバ移設時の作業ミスか

はじめにも書きましたが、サーバを移設したとの事で

それに伴いシステムも移行しDBの接続情報が書かれている const.php を編集したようです

ここでファイルにBOMが付いてしまった可能性が大きいです。

 

windowsのメモ帳などで編集した場合、BOM付きのチェックなどはなく、BOM付きで保存されてしまいますのでコレじゃないかな?

 

const.php を秀丸、さくらエディタなどの保存時にBOM付きを選択できるエディタで開き、BOM無しで保存してサーバにアップロードして

Webファイル一覧からダウンロードしてみたところ、ファイルが開けないという不具合は解消されました

 

まとめ

PHPなどのプログラムソースを編集する場合、BOM付きで保存してはいけません。

サーバ移行の際には注意しましょう。

 

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です