Zipping Files In Memory With Xojo

Zipping Files In Memory With Xojo

If you are generating a lot of files in Xojo to be downloaded, it makes sense to zip your files, so that the end-user has only to download one file.

You can easily achieve this with MonkeyBread’s MBS Plugin: ArchiveWriterMBS, which you can download here.

The following code is showing how to create 3 text files in memory. These files are then getting compressed in memory and then automatically downloaded. This project is for Xojo Web 2.0 but will work as well for Desktop Apps with a few changes.

// Array to store the created files
var files() as WebFile

// >> created as properties in the IDE (e.g. file1 as webfile)
file1 = new WebFile
file2 = new WebFile
file3 = new WebFile

zippedFile = new Webfile

// << created as properties in the IDE (e.g. file1 as webfile)

// Populating the webfiles and adding them to an array
file1.MimeType = "text/plain"
file1.ForceDownload = False
file1.Filename = "file1.txt"
file1.Data = "Lore Lipsum 1"
files.add(file1)

file2.MimeType = "text/plain"
file2.ForceDownload = False
file2.Filename = "file2.txt"
file2.Data = "Lore Lipsum 2"
files.add(file2)

file3.MimeType = "text/plain"
file3.ForceDownload = False
file3.Filename = "file3.txt"
file3.Data = "Lore Lipsum 3"
files.add(file3)

// Defining the ZIP File
zippedFile.MimeType = "application/zip"
zippedFile.ForceDownload = true
zippedFile.Filename = "myCompressedFiles.zip"

// defining the zip file in memory
Var myZip as new ArchiveWriterMBS
myZip.SetFormatZip
myZip.ZipSetCompressionDeflate
var check as boolean = myZip.CreateMemoryFile

if check then
// Looping over all the files in my array of files
for each file as webfile in files
// creating an entry in the zip file per webfile in the array
var e as new ArchiveEntryMBS
e.PathName = file.Filename
e.Size = lenb( file.Data )
e.Permissions = &o0644
e.FileType = e.kFileTypeRegular
myzip.WriteHeader e
call myZip.WriteData file.Data
myZip.FinishEntry
next
myZip.Close
end if

// copy the Zip-File from the memory into the in-memory ZIP-WebFile
zippedFile.data = myZip.MemoryData

// download the zip File
gotoUrl( zippedFile.url )

Did you find this article valuable?

Support Jeannot Muller by becoming a sponsor. Any amount is appreciated!