yab_download: Tiny textpattern plugin to offer downloads

I wrote a tiny textpattern plugin for a customer of mine. It’s nothing spectacular, but if someone need it, feel free to download.

What it does

This plugin allows you to offer a download of multiple files (per file id and/or category) with or without a confirmation button. Additionally you can offer an option to download all the files as zip archive on the fly. The names of the files are read from the files description. If no description is given the filenames are displayed.

Usage

This plugin has only one tag: <txp:yab_download />. You have to place it in an individual article.
The following attributes are available:

files: The IDs of the files, which are for download (seperated by comma). If no files assigned with an ID an error message will displayed in the option field.

label1: Label for select

label2: Label for confirmation checkbox

label3: Label for the submit input

label4: Label for zip download checkbox

notice: Error notice, if confirmation is not set but required

size: Display filesize additionally (values are B, KB,MB, GB,PB).

confirm : Form used with a confirmation checkbox (values: ‚1‘ or some other string)

formid: html id of the element form, used for anchor, if you use more than one <txp:yab_download /> in a single site, make different entries here; (default yab_cd_download)

cats: File categories you will add to download (seperated by comma); will additional displayed with files from files attribute above

exclude: IDs of the files you will exclude; Does only work with cats attribute.

sort: Sort the files from cats; (defaul description asc)

zip: Offfers an checkbox with an option to download all offered files as zip instead (values: ‚1‘ for zip creation; ‚2‘ to force zip creation in memory)

zipname: the name of the offered zip (default all.zip)

hidelist: hides the select list of the files, usefull if you offer only one file or offer many files zipped without a seletion (values: ‚1‘)

hidezip: hides the zip checkbox (download as zip is forced), useful if you offer only one file as zip or many files as zip wihtout a file selection; can be combined with ‚hidelist‘, so only a download button will be displayed (values: ‚1‘)

The full example above will show you a form with two checkboxes. First one offers an option to download all the files zipped. The second checkbox is a confirmation checkbox.
The offered files will be the files with the file id #1, #2, #3, #4 and all files of the categories category1 and category2. If in category1 or category2 a file with the file id #5 and #7 so these will be excluded from download. The zipped file will be named as archive.zip.

Note on zip creation

If you are running a php version 5.2.0 or above so the attribute zip="1" will try to create the zip on harddisk instead in memory. If you have php 5.2.0 or above and you have problems with some restrictions like safe_mode, open_basedir etc., so try the attribute zip="2". This will force the zip creation in memory.

Download

This download of the plugin shows you a real world example.

If you have yab_confirmed_download v0.1 installed, disable or remove it, please! The plugin has been renamed.

Kommentar

In our testing I noticed that using the zip function with large files may result in memory exhaustion causing a corrupt zip to be downloaded to the client. The issue is that each call to zipfile::file() returns a new copy of the zip in memory. Below is a diff of our fix, however a better fix would be if the zipfile class created the zip on disk instead of holding it in memory. The zip on disk could be streamed to the client by your plugin.