cfspreadsheetタグでxlsxファイルを読み込んだ際に、「java.io.IOException: Zip bomb detected!」が発生して読み込むことができない場合があります。
(エラーの例)
An error occurred while reading the Excel: java.io.IOException: Zip bomb detected! The file would exceed the max. ratio of compressed file size to the size of the expanded data. This may indicate that the file is used to inflate memory usage and thus could pose a security risk. You can adjust this limit via ZipSecureFile.setMinInflateRatio() if you need to work with files which exceed this limit. Uncompressed size: 2273561, Raw/compressed size: 22733, ratio: 0.009999 Limits: MIN_INFLATE_RATIO: 0.010000, Entry: xl/styles.xml.
xlsxファイルは、zip形式の圧縮ファイルですが、ファイルの圧縮率が基準(デフォルトは1%)を超えてしまうとエラーで処理を停止します。これは上記のエラーメッセージにもあるようにセキュリティリスクに対する備えとなります。
ファイルサイズの大きいxlsxファイルを読み込もうとした際に、圧縮率の問題によるエラーが発生する傾向にあるようです。そのxlsxファイルを読み込みたい場合はZipSecureFile.setMinInflateRatio()を指定して基準の圧縮率を変更することです。ZipSecureFileは、POIライブラリに含まれています。
ZipSecureFileのドキュメント
https://poi.apache.org/apidocs/dev/org/apache/poi/openxml4j/util/ZipSecureFile.html
ColdFusionで、ZipSecureFileを使用するためには、CreateObject関数を使用します。以下は、圧縮率の基準を1%から0.5%に変更した例です。
<cfscript>
ZipSecureFile=createObject("java", "org.apache.poi.openxml4j.util.ZipSecureFile")
ZipSecureFile.setMinInflateRatio(0.005);
</cfscript>
<cfspreadsheet action="read" src="xlsxファイル" ...>
※一旦圧縮率を変更するとColdFusionを再起動するまでその圧縮率が保持されるようです。
(2023.9追記)
ColdFusion 2023や2021では、複数のパッケージで異なるバージョンのPOIが含まれ、古いPOIが呼び出されるため、変更した圧縮率が反映されません。今後、パッケージ内のPOIが更新されたらこの問題も解消しますが、それまでの間は、以下のどちらかの方法で対応してください。
- ZipSecureFile=createObject("java", "org.apache.poi.openxml4j.util.ZipSecureFile")
↓- ZipSecureFile=createObject("java", "org.apache.poi.openxml4j.util.ZipSecureFile","poi","4.1.2")
※将来のUpdateでPOIライブラリのバージョンが上がった際は、この指定ではエラーとなる可能性があります。その際は、バージョンを変更するか、バージョンを含めない表記に変えて動作を試してください。
記事公開日:2022年11月18日
最終更新日:2023年09月08日
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.
Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.