Unzip files with ColdFusion MX 7 using native Java classes

This week I had to unzip some files using ColdFusion 7 (I know it’s ancient technology) and I realised that CF7 doesn’t natively support zipping/unzipping of files!  Fortunately, ColdFusion can utilise the underlying power of Java to achieve this.  I found this neat Java article – Unzipping Files with java.util.zip.ZipFile and simply translated it into ColdFusion 7.

Here is the ColdFusion version that works well on CFMX7:

<cfparam name="dest" default="/path_to_extract/">
<cffunction name="getByteArray" access="private" returnType="binary" output="no">
	<cfargument name="size" type="numeric" required="true"/>
	<cfset var emptyByteArray =
	createObject("java", "java.io.ByteArrayOutputStream").init().toByteArray()/>
	<cfset var byteClass = emptyByteArray.getClass().getComponentType()/>
	<cfset var byteArray =
	createObject("java","java.lang.reflect.Array").newInstance(byteClass, arguments.size)/>

	<cfreturn byteArray />
</cffunction>
<cfscript>
if(structKeyExists(form,"myFile") and len(form.myFile)) {
	content = ArrayNew(1);
	FileOutputStream = createObject('java',"java.io.FileOutputStream");
	BufferedOutputStream = createObject('java',"java.io.BufferedOutputStream");
	ZipFile = createObject('java',"java.util.zip.ZipFile");
	ioFile = createObject('java',"java.io.File");
	Byte = createObject('java',"java.lang.Byte");

	buffer = getByteArray(1024);
	length = 0;

	zipFileName = form.myFile;

	zFile = ZipFile.init(zipFileName);
	entries = zFile.entries();

	while(entries.hasMoreElements()) {
		entry = entries.nextElement();

		if(entry.isDirectory()) {
			// Assume directories are stored parents first then children.
			ioFile.init(dest & entry.getName()).mkdir();
			continue;
		}
		in = zipFile.getInputStream(entry);
		out = BufferedOutputStream.init(FileOutputStream.init(dest & entry.getName()));
		length = in.read(buffer);
		while(length gte 0) {
			out.write(buffer, 0, length);
			length = in.read(buffer);
		}

		in.close();
		out.close();
	}

	zFile.close();

	//loop tghrough content array and decrypt
}
</cfscript>
<form name="myForm" method="POST" action="zip.cfm" enctype="multipart/form-data">
	<input type="file" name="myfile" />
	<input type="submit" name="submit" value="Upload" />
</form>

Marko