/Zippex

Native Apex Zip library for Salesforce.com

Primary LanguageApexMIT LicenseMIT

Copyright (c) 2015 Pedro Dal Col, Pliny Smith

Zippex (aka Zipper)

Native Apex Zip utility for the salesforce.com platform.

Table of Contents

How to install

Option 1: Manually save files to SF

Copy and paste from this repository the following four classes into new classes in your Salesforce instance.

  1. HexUtil.cls
  2. Puff.cls
  3. Zippex.cls
  4. ZippexTests.cls

Option 2: Use the 'Deploy to Salesforce' button

Deploy to Salesforce

How to use

Constructors:

Zippex()

public Zippex()

Instantiates a new empty Zippex object (empty Zip archive).

Example
Zippex sampleZip = new Zippex();

Zippex(fileData)

public Zippex(Blob fileData)

Instantiates a new Zippex object from an existing Zip file.

Parameters
Name Type Description
fileData Blob Data containing a valid Zip file
Example
Attachment sampleAttachment = [SELECT Name, Body FROM Attachment WHERE Id='<ID_OF_ATTACHMENT>'];
Zippex sampleZip = new Zippex(sampleAttachment.Body);

Public Methods:

addFile(fileName, fileData, crc32)

public void addFile(String fileName, Blob fileData, String crc32)

Adds a new file to the current Zip archive.

Parameters
Name Type Description
fileName String File name including full path
fileData Blob Data containing the file data
crc32 String (optional) little endian hex value of the CRC32. Enter null for addFile to calculate the CRC32 of the fileData
Example
Zippex sampleZip = new Zippex();
Blob fileData = Blob.valueOf('Sample text.');
sampleZip.addFile('sampleFolder/test.txt', fileData, null);
Blob zipData = sampleZip.getZipArchive();

containsFile(fileName)

public Boolean containsFile(String fileName)

Returns true if the current Zip archive contains the specified file.

Parameters
Name Type Description
fileName String File name including full path
Return Boolean Return true if file is in Zip archive
Example
Zippex sampleZip = new Zippex();
sampleZip.addFile('sampleFolder/test.txt', Blob.valueOf('Sample text.'), null);
System.assert(sampleZip.containsFile('sampleFolder/test.txt'));

getFileNames()

public Set<String> getFileNames()

Returns a set of filenames from the current Zip archive.

Parameters
Name Type Description
Return Set<String> Returns all file names including full path in the current Zip archive
Example
Attachment sampleAttachment = [SELECT Name, Body FROM Attachment WHERE Id='<ID_OF_ATTACHMENT>'];
Zippex sampleZip = new Zippex(sampleAttachment.Body);
Set <String> fileNames = sampleZip.getFileNames();
for (String fileName : fileNames)
{
    System.debug('file: ' + fileName);
}

getFile(fileName)

public Blob getFile(String fileName)

Extracts the specified file contents from the current Zip archive. If the file does not exist, returns null.

Parameters
Name Type Description
fileName String File name including full path
Return Blob File data
Example
Zippex sampleZip = new Zippex();
sampleZip.addFile('sampleFolder/test.txt', Blob.valueOf('Sample text.'), null);
Blob fileData = sampleZip.getFile('sampleFolder/test.txt');
System.assertEquals ('Sample text.', fileData.toString());

getFileInfo(fileName)

public Map<String,String> getFileInfo(String fileName)

Returns file metadata (lastModDateTime, crc32, fileSize, fileName, and fileComment).

Parameters
Name Type Description
fileName String File name including full path
Return Map<String,String> Contains values for lastModDateTime, crc32, fileSize, fileName, and fileComment
Example
Zippex sampleZip = new Zippex();
sampleZip.addFile('sampleFolder/test.txt', Blob.valueOf('Sample text.'), null);
Map <String, String> fileInfoMap = sampleZip.getFileInfo('sampleFolder/test.txt');
System.assertEquals ('12', fileInfoMap.get('fileSize'));
System.assertEquals ('sampleFolder/test.txt', fileInfoMap.get('fileName'));

getZipArchive()

public Blob getZipArchive()

Returns a Blob that contains the entire Zip archive.

Parameters
Name Type Description
Return Blob Full Zip archive data
Example
Zippex sampleZip = new Zippex();
sampleZip.addFile('sampleFolder/test.txt', Blob.valueOf('Sample text.'), null);
Blob zipData = sampleZip.getZipArchive();

removeFile(fileName)

public void removeFile(String fileName)

Removes a file from the current Zip archive.

Parameters
Name Type Description
fileName String File name to remove from Zip archive including full path
Example
Zippex sampleZip = new Zippex();
sampleZip.addFile('sampleFolder/file1.txt', Blob.valueOf('Sample text1.'), null);
sampleZip.addFile('sampleFolder/file2.txt', Blob.valueOf('Sample text2.'), null);
System.assert(sampleZip.getFileNames().contains('sampleFolder/file1.txt'));
System.assert(sampleZip.getFileNames().contains('sampleFolder/file2.txt'));
sampleZip.removeFile('sampleFolder/file1.txt');
System.assert(sampleZip.getFileNames().contains('sampleFolder/file1.txt') == false);
System.assert(sampleZip.getFileNames().contains('sampleFolder/file2.txt'));

renameFile(oldName, newName)

public void renameFile(String oldName, String newName)

Renames a file in the current Zip archive.

Parameters
Name Type Description
oldName String The current file name to be modified
newName String The new name that replaces the current file name
Example
Zippex sampleZip = new Zippex();
sampleZip.addFile('sampleFolder/file.txt', Blob.valueOf('Sample text1.'), null);
System.assert(sampleZip.getFileNames().contains('sampleFolder/file.txt'));
sampleZip.renameFile('sampleFolder/file.txt', 'sampleFolder/changedName.txt');
System.assert(sampleZip.getFileNames().contains('sampleFolder/file.txt') == false);
System.assert(sampleZip.getFileNames().contains('sampleFolder/changedName.txt'));

removePrefix(prefix)

public void removePrefix(String prefix)

Removes the specified prefix from all file names in the current Zip archive only if it occurs at the beginning of the file name.

Parameters
Name Type Description
prefix String The prefix to remove from file names
Example
Zippex sampleZip = new Zippex();
sampleZip.addFile('sampleFolder/file.txt', Blob.valueOf('Sample text1.'), null);
System.assert(sampleZip.getFileNames().contains('sampleFolder/file.txt'));
sampleZip.removePrefix('sample');
System.assert(sampleZip.getFileNames().contains('sampleFolder/file.txt') == false);
System.assert(sampleZip.getFileNames().contains('Folder/file.txt'));

unzipAttachment(srcAttId, destObjId, fileNames, attemptAsync)

public static void unzipAttachment(Id srcAttId, Id destObjId, String[] fileNames, Boolean attemptAsync){
Parameters
Name Type Description
srcAttId Id ID of the attachment to unzip
destObjId Id ID of the object to which unzipped files should be attached. If null the ParentId of the Zip archive will be used
fileNames String[] List containing file names to uncompress. If null, all files will be uncompressed
attemptAsync Boolean If true, it attempts to unzip files in a future call
Example
Zippex.unzipAttachment('<ID_OF_ATTACHMENT>', null, null, false);