alecpl
2011-08-01 b95149eb636f54cc6dff7fa37621524e20406133
- Fixed contact photos upload, moved code to separate file for better performance                                                       
(to handle upload we don't need to initialize addressbook source)


1 files added
2 files modified
159 ■■■■ changed files
program/steps/addressbook/func.inc 4 ●●●● patch | view | raw | blame | history
program/steps/addressbook/save.inc 72 ●●●●● patch | view | raw | blame | history
program/steps/addressbook/upload_photo.inc 83 ●●●●● patch | view | raw | blame | history
program/steps/addressbook/func.inc
@@ -309,8 +309,9 @@
            if ($val == '' && $col == 'name') {
                $val = rcube_addressbook::compose_display_name($row, true);
            }
            $a_row_cols[$col] = Q($val);
        }
    }
        $OUTPUT->command($prefix.'add_contact_row', $row['ID'], $a_row_cols);
    }
@@ -729,7 +730,6 @@
$RCMAIL->register_action_map(array(
    'add' => 'edit.inc',
    'photo' => 'show.inc',
    'upload-photo' => 'save.inc',
    'group-create' => 'groups.inc',
    'group-rename' => 'groups.inc',
    'group-delete' => 'groups.inc',
program/steps/addressbook/save.inc
@@ -23,83 +23,11 @@
$cid      = get_input_value('_cid', RCUBE_INPUT_POST);
$return_action = empty($cid) ? 'add' : 'edit';
// Source changed, display the form again
if (!empty($_GET['_reload'])) {
  rcmail_overwrite_action($return_action);
  return;
}
// cannot edit record
if ($CONTACTS->readonly) {
  $OUTPUT->show_message('contactreadonly', 'error');
  rcmail_overwrite_action($return_action);
  return;
}
// handle photo upload for contacts
if ($RCMAIL->action == 'upload-photo') {
    // clear all stored output properties (like scripts and env vars)
    $OUTPUT->reset();
    if ($filepath = $_FILES['_photo']['tmp_name']) {
        // check file type and resize image
        $imageprop = rcmail::imageprops($_FILES['_photo']['tmp_name']);
        if ($imageprop['width'] && $imageprop['height']) {
            $maxsize = intval($RCMAIL->config->get('contact_photo_size', 160));
            $tmpfname = tempnam($RCMAIL->config->get('temp_dir'), 'rcmImgConvert');
            $save_hook = 'attachment_upload';
            // scale image to a maximum size
            if (($imageprop['width'] > $maxsize || $imageprop['height'] > $maxsize) &&
                  (rcmail::imageconvert(array('in' => $filepath, 'out' => $tmpfname, 'size' => $maxsize.'x'.$maxsize, 'type' => $imageprop['type'])) !== false)) {
                $filepath = $tmpfname;
                $save_hook = 'attachment_save';
            }
            // save uploaded file in storage backend
            $attachment = $RCMAIL->plugins->exec_hook($save_hook, array(
                'path' => $filepath,
                'size' => $_FILES['_photo']['size'],
                'name' => $_FILES['_photo']['name'],
                'mimetype' => 'image/' . $imageprop['type'],
                'group' => 'contact',
            ));
        }
        else
            $attachment['error'] = rcube_label('invalidimageformat');
        if ($attachment['status'] && !$attachment['abort']) {
            $file_id = $attachment['id'];
            $_SESSION['contacts']['files'][$file_id] = $attachment;
            $OUTPUT->command('replace_contact_photo', $file_id);
        }
        else {  // upload failed
            $err = $_FILES['_photo']['error'];
            if ($err == UPLOAD_ERR_INI_SIZE || $err == UPLOAD_ERR_FORM_SIZE)
                $msg = rcube_label(array('name' => 'filesizeerror', 'vars' => array('size' => show_bytes(parse_bytes(ini_get('upload_max_filesize'))))));
            else if ($attachment['error'])
                $msg = $attachment['error'];
            else
                $msg = rcube_label('fileuploaderror');
            $OUTPUT->command('display_message', $msg, 'error');
        }
    }
    else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        // if filesize exceeds post_max_size then $_FILES array is empty,
        // show filesizeerror instead of fileuploaderror
        if ($maxsize = ini_get('post_max_size'))
            $msg = rcube_label(array('name' => 'filesizeerror', 'vars' => array('size' => show_bytes(parse_bytes($maxsize)))));
        else
            $msg = rcube_label('fileuploaderror');
        $OUTPUT->command('display_message', $msg, 'error');
    }
    $OUTPUT->command('photo_upload_end');
    $OUTPUT->send('iframe');
}
// read POST values into hash array
program/steps/addressbook/upload_photo.inc
New file
@@ -0,0 +1,83 @@
<?php
/*
 +-----------------------------------------------------------------------+
 | program/steps/addressbook/upload_photo.inc                            |
 |                                                                       |
 | This file is part of the Roundcube Webmail client                     |
 | Copyright (C) 2005-2011, The Roundcube Dev Team                       |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 | PURPOSE:                                                              |
 |   Handles contact photo uploads                                       |
 |                                                                       |
 +-----------------------------------------------------------------------+
 | Author: Thomas Bruederli <roundcube@gmail.com>                        |
 +-----------------------------------------------------------------------+
 $Id$
*/
// clear all stored output properties (like scripts and env vars)
$OUTPUT->reset();
console($_FILES);
if ($filepath = $_FILES['_photo']['tmp_name']) {
    // check file type and resize image
    $imageprop = rcmail::imageprops($_FILES['_photo']['tmp_name']);
    if ($imageprop['width'] && $imageprop['height']) {
        $maxsize = intval($RCMAIL->config->get('contact_photo_size', 160));
        $tmpfname = tempnam($RCMAIL->config->get('temp_dir'), 'rcmImgConvert');
        $save_hook = 'attachment_upload';
        // scale image to a maximum size
        if (($imageprop['width'] > $maxsize || $imageprop['height'] > $maxsize) &&
            (rcmail::imageconvert(array('in' => $filepath, 'out' => $tmpfname,
                'size' => $maxsize.'x'.$maxsize, 'type' => $imageprop['type'])) !== false)) {
            $filepath = $tmpfname;
            $save_hook = 'attachment_save';
        }
        // save uploaded file in storage backend
        $attachment = $RCMAIL->plugins->exec_hook($save_hook, array(
            'path' => $filepath,
            'size' => $_FILES['_photo']['size'],
            'name' => $_FILES['_photo']['name'],
            'mimetype' => 'image/' . $imageprop['type'],
            'group' => 'contact',
        ));
    }
    else
        $attachment['error'] = rcube_label('invalidimageformat');
    if ($attachment['status'] && !$attachment['abort']) {
        $file_id = $attachment['id'];
        $_SESSION['contacts']['files'][$file_id] = $attachment;
        $OUTPUT->command('replace_contact_photo', $file_id);
    }
    else {  // upload failed
        $err = $_FILES['_photo']['error'];
        if ($err == UPLOAD_ERR_INI_SIZE || $err == UPLOAD_ERR_FORM_SIZE)
            $msg = rcube_label(array('name' => 'filesizeerror', 'vars' => array('size' => show_bytes(parse_bytes(ini_get('upload_max_filesize'))))));
        else if ($attachment['error'])
            $msg = $attachment['error'];
        else
            $msg = rcube_label('fileuploaderror');
        $OUTPUT->command('display_message', $msg, 'error');
    }
}
else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // if filesize exceeds post_max_size then $_FILES array is empty,
    // show filesizeerror instead of fileuploaderror
    if ($maxsize = ini_get('post_max_size'))
        $msg = rcube_label(array('name' => 'filesizeerror', 'vars' => array('size' => show_bytes(parse_bytes($maxsize)))));
    else
        $msg = rcube_label('fileuploaderror');
    $OUTPUT->command('display_message', $msg, 'error');
}
$OUTPUT->command('photo_upload_end');
$OUTPUT->send('iframe');