Creating a ZIP file in Elixir

Creating ZIP files in Elixir is easy because of Erlang’s :zip module. Here’s how to create a ZIP archive both on disk and in memory.

To make the ZIP archive, we’ll use :zip.create/3 from Erlang:

{ok, filename} = :zip.create("file.zip", files)

The function accepts only charlists for file names, so we have to convert the file names first with String.to_charlist/1:

files = files |> Enum.map(&String.to_charlist/1)

In case you want to archive all files from a given directory, you can use File.ls! to build the file names list:

files = File.ls!("/path/to/dir") |> Enum.map(&String.to_charlist/1)

{ok, filename} = :zip.create("file.zip", files, cwd: "/path/to/dir")

In this case, I am using the cwd option (as “current working directory”) to set where the file is and prevent absolute paths from being included.

If you need a temporary directory for this or for saving the final archive, you can use Temp.path!/0 and File.mkdir/1:

tmp_dir = Temp.path!()
dir = File.mkdir(tmp_dir)

Finally, :zip.create/3 has an option to create the ZIP file entirely in memory, if that’s what you need:

{:ok, {filename, bytes}} = :zip.create("file.zip", [{'file1', "file 1 content"}, {'file2',"file 2 content"}], [:memory])

← BUY THE PRE-RELEASE

I am writing a complete guide on web application deployment. Ruby with Puma, Python with Gunicorn, NGINX, PostgreSQL, Redis, networking, processes, systemd, backups, and all your usual suspects. 23 chapters and 3 scripted demonstrations already available.

More →