Update zipdownload plugin to work with multi-folder search results

pull/175/head
Thomas Bruederli 10 years ago
parent 0456f728ee
commit bde3ba5e93

@ -3,7 +3,7 @@
"type": "roundcube-plugin",
"description": "Adds an option to download all attachments to a message in one zip file, when a message has multiple attachments. Also allows the download of a selection of messages in one zip file and the download of entire folders.",
"license": "GNU GPLv3+",
"version": "2.0",
"version": "2.1",
"authors": [
{
"name": "Thomas Bruederli",

@ -19,10 +19,10 @@
<email>roundcube@gmail.com</email>
<active>yes</active>
</lead>
<date>2012-09-20</date>
<time>19:16:00</time>
<date>2014-04-07</date>
<time>17:28:00</time>
<version>
<release>2.0</release>
<release>2.1</release>
<api>2.0</api>
</version>
<stability>

@ -5,7 +5,7 @@
*
* Plugin to allow the download of all message attachments in one zip file
*
* @version @package_version@
* @version 2.1
* @requires php_zip extension (including ZipArchive class)
* @author Philip Weir
* @author Thomas Bruderli
@ -156,10 +156,10 @@ class zipdownload extends rcube_plugin
public function download_selection()
{
if (isset($_REQUEST['_uid'])) {
$uids = explode(",", rcube_utils::get_input_value('_uid', rcube_utils::INPUT_GPC));
$messageset = rcmail::get_uids();
if (sizeof($uids) > 0) {
$this->_download_messages($uids);
if (sizeof($messageset) > 0) {
$this->_download_messages($messageset);
}
}
}
@ -193,7 +193,7 @@ class zipdownload extends rcube_plugin
}
if (sizeof($uids) > 0)
$this->_download_messages($uids);
$this->_download_messages(array($mbox_name => $uids));
}
/**
@ -201,38 +201,45 @@ class zipdownload extends rcube_plugin
*
* @param array List of message UIDs to download
*/
private function _download_messages($uids)
private function _download_messages($messageset)
{
$rcmail = rcmail::get_instance();
$imap = $rcmail->get_storage();
$temp_dir = $rcmail->config->get('temp_dir');
$tmpfname = tempnam($temp_dir, 'zipdownload');
$tempfiles = array($tmpfname);
$folders = count($messageset) > 1;
// open zip file
$zip = new ZipArchive();
$zip->open($tmpfname, ZIPARCHIVE::OVERWRITE);
foreach ($uids as $uid){
$headers = $imap->get_message_headers($uid);
$subject = rcube_mime::decode_mime_string((string)$headers->subject);
$subject = $this->_convert_filename($subject);
$subject = substr($subject, 0, 16);
$disp_name = ($subject ? $subject : 'message_rfc822') . ".eml";
$disp_name = $uid . "_" . $disp_name;
$tmpfn = tempnam($temp_dir, 'zipmessage');
$tmpfp = fopen($tmpfn, 'w');
$imap->get_raw_body($uid, $tmpfp);
$tempfiles[] = $tmpfn;
fclose($tmpfp);
$zip->addFile($tmpfn, $disp_name);
foreach ($messageset as $mbox => $uids){
$imap->set_folder($mbox);
$path = $folders ? str_replace($imap->get_hierarchy_delimiter(), '/', $mbox) . '/' : '';
foreach ($uids as $uid){
$headers = $imap->get_message_headers($uid);
$subject = rcube_mime::decode_mime_string((string)$headers->subject);
$subject = $this->_convert_filename($subject);
$subject = substr($subject, 0, 16);
$disp_name = ($subject ? $subject : 'message_rfc822') . ".eml";
$disp_name = $path . $uid . "_" . $disp_name;
$tmpfn = tempnam($temp_dir, 'zipmessage');
$tmpfp = fopen($tmpfn, 'w');
$imap->get_raw_body($uid, $tmpfp);
$tempfiles[] = $tmpfn;
fclose($tmpfp);
$zip->addFile($tmpfn, $disp_name);
}
}
$zip->close();
$this->_deliver_zipfile($tmpfname, $imap->get_folder() . '.zip');
$filename = $folders ? 'messages' : $imap->get_folder();
$this->_deliver_zipfile($tmpfname, $filename . '.zip');
// delete temporary files from disk
foreach ($tempfiles as $tmpfn) {

Loading…
Cancel
Save