Zip export for Plone
ftw.zipexport provides a generic solution to export data from plone in a zip archive.
A user can export data with the “Export as Zip” action in document listings.
For zipping files with a total size of over 4Gb python 2.7.4 is required.
- Add ftw.zipexport to your buildout configuration
[instance] eggs = ftw.zipexport
- Run buildout
- Install ftw.zipexport in portal_setup
In a first step we have to collect all data to zip. Use the IZipRepresentation interface for this task.
The get_files function returns a list of tuples. The tuples consist of two values. First a relative path under which the file should show up in the zip. Second the data as eather a file or a stream.
class IZipRepresentation(Interface): def get_files(path_prefix='', recursive=True, toplevel=True):
By default we support basic data-types like folder and files. More complex data-types require an own adapter for IZipRepresentation.
Feel free to extend one of the predefined adapters: Predefined representations
The data generated by our IZipRepresentation then gets delivered to the ZipGeneration helper class.
class ZipGenerator(object): def add_file(file_path, file_pointer): Zipps the file and adds it to the archive. If large or many files are selected this function might take some time to execute. def generate(): returns a temp file holding the generated zip
Here is the sample code of the described steps:
from zope.component import getMultiAdapter from ftw.zipexport.generation import ZipGenerator from ftw.zipexport.interfaces import IZipRepresentation ziprepresentation = getMultiAdapter((self.folder, self.request), interface=IZipRepresentation) with ZipGenerator() as zipgenerator: for file_path, file_pointer in ziprepresentation.get_files(): zipgenerator.add_file(file_path, file_pointer) generated_zip_pointer = zipgenerator.generate()
The download is handled in a standard BrowserView which plainly reads from the temp file. For details check out the code: zipexportview.py.
Current supported data-types
- IDexterityItem with IPrimaryFieldInfo
Paths are automatically using Plone’s IFileNameNormalizer. If you want to use a custom normalization, you can pass it to the ZipGenerator:
from ftw.zipexport.generation import ZipGenerator from Products.CMFPlone.utils import safe_unicode import re def normalize_path(path): path = safe_unicode(path).replace(u'\\', u'/') return re.sub(ur'[^\w\-.\/]', u'', path) with ZipGenerator(path_normalizer=normalize_path) as zipgenerator: ...
Pass None to disable normalization completely:
from ftw.zipexport.generation import ZipGenerator with ZipGenerator(path_normalizer=None) as zipgenerator: ...
Nice to have
This package is copyright by 4teamwork.
ftw.zipexport is licensed under GNU General Public License, version 2.
- Allow IFolderish to specify a custom title via a property. [Rotonen]
- Drop support for Plone 4.2. [mbaechtold]
- Remove wrong allowed check on context for zip selected view. [phgross]
- Fix encoding bug when zip filename contains umlauts. [phgross]
- Include empty folders by default and add possibility to deactivate this behavior. [elioschmutz]
- Drop official support for Python 2.6 [jone]
- Add events for the ZIP exports [Rotonen]
- Do not fail when exporting AT folders with titles containing umlauts [fRiSi]
- Fall back to object.id in case filename is not set. [fRiSi]
- Normalize all paths added to the ZIP file. [jone]
- Handle path encoding in ZIP. [jone]
- Added check if fs has enough space to create the zip file. [lknoepfel]
- Fixed a bug in the file export which occurred if the file to be exported did not have a blob but an OFS file. [mbaechtold]
- Fixed metadata version in default profile. [lknoepfel]
- Added option to select multiple interfaces on which the export is available. [lknoepfel]
- Added error message when the content is too big to zip. This happens when the ZIP64 isn’t available and the content is bigger than 4GB. [lknoepfel]
- Corrected error message when no zip-exportable content is selected. [lknoepfel]
- Deny zipexport on unallowed content. [lknoepfel]
- Include default AT image files. [jone]
- Added French translation by I. Anthenien. [lknoepfel]
- Added handling for files with same filename. [lknoepfel]
- Added a separate profile to install an additional zip-export document action. [deif]
- Added export limitation. [lknoepfel]
- Fix encoding problem with nested folders containing umlauts in the title. [jone]
- Initial Development