ColdFusionカフェテリア
SAMURAIZ

 

| ↑一覧 |

Zip4JとColdFusionとを組み合わせてZIPファイルの操作を試してみる

ColdFusion 8 より追加されている<cfzip>タグは、標準の java.util.zip が使われていますが、このライブラリはパスワード付きZIPファイルの操作を行うことができないことと、ファイル名に日本語が含まれている場合に、文字コードをUTF-8で固定して処理を行います。そのため、<cfzip>タグを使ってファイルの圧縮や解凍などを行うと、Windows環境では文字化けを起こす結果となります。標準のライブラリでは行えない処理に対して、Zip4Jを使った例を紹介します。

このページ(ColdFusion 実験室)で紹介する内容について

ColdFusion 実験室で公開している情報は、ColdFusionの標準の機能では無いため動作の保証外(未サポート)となります。下記の事項も含めてそれらを予めご認識頂いた上で、参考にされるかどうかをご判断下さい。

  • このページ内容や参考プログラムは、内容の正確さや最新さを保証するものではありません
  • 今後メーカーより提供されるアップデートやバージョンアップなどで、この記事の内容が動作しなくなるかもしれません
  • 紹介している外部のライブラリ等についての使用許諾範囲は、ライブラリのダウンロードサイト等にて各自ご確認下さい
  • 特に記載が無い限りは、Windows 64bit OS上の 64bit 版ColdFusion10 評価版で試しています。それ以外の異なるOS(32bit/64bit)やエディションなどでは確認していませんので、動き等が異なる場合はご了承下さい

準備

  • Zip4Jライブラリをダウンロードします。

    ※こちらでZip4Jをダウンロードしたサイトはhttp://www.lingala.net/zip4j/です。

  • ColdFusionサービスを停止し、ColFusion クラスパスにダウンロードした jar ファイルを配置します。

    ※こちらのテスト環境では、[cf10_root]/cfusion/lib内にファイルを配置しました。このフォルダには多くのライブラリが置かれていますのでメンテナンス時(例えば、配置したファイルを削除しようとした際)には、誤って別のファイルを操作しないように注意して下さい。

    ※ColdFusion 10ではApplication.cfcでライブラリのパスを指定することができますので、他のライブラリとは別のフォルダにファイルを配置したい場合はこちらもお試し下さい。
      http://help.adobe.com/ja_JP/ColdFusion/10.0/Developing/WSe61e35da8d318518-106e125d1353e804331-7fff.html

  • ColdFusionを起動し、ColdFusion Administratorの[システム情報ページ(右上の i アイコン)]ページで追加した jar ファイルが「CF サーバー Java クラスパス」に含まれていることを確認します。

    ※ColdFusion 10で Javaライブラリのパスを指定している場合は、一覧では確認できません。

 

実験: パスワード付きのZIPファイルを作成するサンプル

このサンプルでは、Zip4JライブラリからZipFile、Zip4jConstants、ZipParametersクラスのインスタンスを作成して、所定のメソッドを実行してzipファイルを作成しています。初期値として、SourceDir(圧縮するフォルダ)、zipFileName(zipファイルの保存先)、zipPassword(パスワード)を指定して下さい。パスワードに値が指定されている場合はパスワードをセットするメソッドも実行します。また、圧縮するファイルに日本語のファイル名が含まれている場合は、ファイル名に対するエンコードを setFileNameCharsetメソッドで指定して、Windows-31J(日本語Shift_JIS)を指定することで Windows環境でファイルの文字化けを防ぐことができます。

 

<cfscript>
//圧縮するフォルダを指定
SourceDir="c:\temp";

//圧縮したZIPファイルの置き場所を指定
zipFileName=ExpandPath('./out/zippedFiles.zip');

//ZIPファイルにパスワードを掛ける場合はパスワードを指定(指定しない場合は"")
zipPassword="test123";

zipFile = createObject("java", "net.lingala.zip4j.core.ZipFile").init(zipFileName);
zipFile.setFileNameCharset("Windows-31J");

zipConstants = createObject("java", "net.lingala.zip4j.util.Zip4jConstants");
zipParameters = createObject("java", "net.lingala.zip4j.model.ZipParameters");

//圧縮率
zipParameters.setCompressionMethod(zipConstants.COMP_DEFLATE);
zipParameters.setCompressionLevel(zipConstants.DEFLATE_LEVEL_NORMAL);

//パスワードが空白でない場合は、パスワードをセットする
if(zipPassword IS NOT ""){
	zipParameters.setEncryptFiles(true);
	zipParameters.setEncryptionMethod(zipConstants.ENC_METHOD_STANDARD);
	zipParameters.setPassword(zipPassword);
}

//圧縮の実行
zipFile.addFolder(SourceDir, zipParameters);
</cfscript>

 

各クラスにどのようなメソッドがあるかを参照したい場合は、上記の参照サイト(grepcode.com)の内容を参考にするか、または<cfdump>やWriteDump()でオブジェクトを指定して確認下さい。

 

例:<cfdump var="#zipFile#">

実験: ZIPファイル内のファイルリストを表示するサンプル

このサンプルでは、ZIPファイル内のファイルリストを表示します。対象のZIPファイルのパス・ファイル名を変数にセットし、その値を使ってZipFileのインスタンスを作成します。getFileHeaders()メソッドの結果はColdFusion配列に格納されますので、その後は配列に対するループを行い、getFileName()メソッドでファイル名を取得して表示します。

 

<cfscript>
//対象のZIPファイルのファイル・パスを指定
zipFilePath = ExpandPath('./out/zippedFiles.zip');

zipFile = createObject('java', 'net.lingala.zip4j.core.ZipFile').init(zipFilePath); 
zipFile.setFileNameCharset("Windows-31J");

//ファイルヘッダを取得する(ファイル一覧は配列データ)
aFileHeaders=zipFile.getFileHeaders();

//配列をループし、ファイル名を表示する
for(i=1; i LTE ArrayLen(aFileHeaders); i=i+1) {
	if(not aFileHeaders[i].isDirectory()){
	    writeOutput(aFileHeaders[i].getFileName() & "<br>");
	}
}
</cfscript>

 

実験: パスワード付きのZIPファイルを解凍するサンプル

このサンプルでは、該当するZIPファイルを解凍します。ZipFileライブラリのisEncrypted()メソッドで、ZIPファイルにパスワードが掛かっている場合は、setPassword()でパスワードを指定しています。誤ったパスワードを指定していると、解凍時(exactAll()メソッド実行時)にエラーが発生するため、サンプルには例外処理を含めています。

 

<cfscript>
//対象のZIPファイルのファイル・パスを指定
zipFilePath = ExpandPath('./out/zippedFiles.zip');

//解凍先のフォルダを指定
destPath = ExpandPath('./out/');

//ZIPファイルの解除用パスワードを指定(パスワードが掛かっていない場合は"")
zipPassword = "test123";

zipFile = createObject('java', 'net.lingala.zip4j.core.ZipFile').init(zipFilePath); 
zipFile.setFileNameCharset("Windows-31J");

if(zipFile.isEncrypted()){
	zipFile.setPassword(zipPassword);
}

try {
	zipFile.extractAll(destPath);
}
catch(any excpt) {
	writeOutput("ファイルの解凍に失敗しました。パスワードが間違っているかもしれません。<br>");
	writeOutput("エラーメッセージ:" & excpt.message);
}
</cfscript>

 

まとめ

今回の実験室はいかがだったでしょうか?上記では該当する処理の部分のみを紹介していますが、処理をUDFやCFCにまとめて色々なページから呼び出すなども効果的かと思います。

ColdFusionはJavaをベースとしたアプリケーションのため、JavaライブラリとColdFusionとの組み合わせが可能なものであれば、既存の機能で足りない部分を補う効果が期待できます。 ただし、Javaライブラリとの組み合わせで動かせる範囲に制限があったり、そもそもまともに動かなかったりするものもあると思います。主に海外の情報となりますがColdFusionとJavaライブラリを組み合わせた色々な情報が掲載されていますので、それらの情報もぜひ参考にして下さい。

ColdFusionの各種情報の配信


最新情報
■2017/3/27
ColdFusion 2016 対応
インストール セットアップ情報
CFサーバーのインストール
CFビルダーのインストール

■2016/9/20
『ColdFusion 2016 リリース
Enterprise Edition 活用資料』
記事一覧

■2016/3/30
『ColdFusion 実験室』
実験4、実験5

■2015/8/10 〜
『ColdFusion クリニック』
記事一覧(随時更新中)

■2015/4/8
『JasperReportsによる帳票出力』
2. JasperReportsによる帳票出力【後編】

■2015/3/12
アップクロス株式会社
西元 貞昭様
『JasperReportsによる帳票出力』
1. JasperReportsによる帳票出力【前編】


■2015/2/25
『ColdFusionでエクセルを使いこなそう!』
4. 【上級】ColdFusionのエクセル機能を利用したPDF帳票の紹介

ColdFusionトレーニング


ColdFusionユーザーグループ
ColdFusionユーザーグループ
Copyright 2012 Samuraiz Corporation. All Rights Reserved.