You are here

function _webform_validate_multifile in Webform Multiple File Upload 7

Same name and namespace in other branches
  1. 6 multifile.inc \_webform_validate_multifile()

A Form API element validate function.

Ensure that the uploaded file matches the specified file types.

1 string reference to '_webform_validate_multifile'
_webform_render_multifile in ./multifile.inc
Implementation of _webform_render_component().

File

./multifile.inc, line 491
Webform module file component.

Code

function _webform_validate_multifile(&$element, &$form_state) {
  $component = $element['#webform_component'];
  $form_key = implode('_', $element['#parents']);
  if (empty($_FILES['files']['size'][$form_key]) || !isset($_FILES['files']['size'][$form_key][0]) || empty($_FILES['files']['size'][$form_key][0])) {
    return;
  }

  // Build a human readable list of extensions:
  $extensions = $component['extra']['filtering']['types'];
  $extension_list = '';
  if (count($extensions) > 1) {
    for ($n = 0; $n < count($extensions) - 1; $n++) {
      $extension_list .= $extensions[$n] . ', ';
    }
    $extension_list .= 'or ' . $extensions[count($extensions) - 1];
  }
  elseif (!empty($extensions)) {
    $extension_list = $extensions[0];
  }
  if (in_array('jpg', $extensions)) {
    $extensions[] = 'jpeg';
  }
  foreach ($_FILES['files']['name'][$form_key] as $key => $filename) {
    $filename = _webform_multifile_get_files_array_value($filename, $form_key);
    $dot = strrpos($filename, '.');
    $extension = drupal_strtolower(drupal_substr($filename, $dot + 1));
    $file_error = FALSE;
    if (!empty($extensions) && !in_array($extension, $extensions)) {
      form_error($element, t("Files with the '%ext' extension are not allowed, please upload a file with a %exts extension.", array(
        '%ext' => $extension,
        '%exts' => $extension_list,
      )));
      $file_error = TRUE;
    }
  }
  foreach ($_FILES['files']['size'][$form_key] as $key => $size) {
    $size = (int) _webform_multifile_get_files_array_value($size, $form_key);

    // Now let's check the file size (limit is set in KB).
    if ($size > $component['extra']['filtering']['size'] * 1024) {
      form_error($element, t("The file '%filename' is too large (%filesize KB). Please upload a file %maxsize KB or smaller.", array(
        '%filename' => $_FILES['files']['name'][$form_key][$key],
        '%filesize' => (int) ($size / 1024),
        '%maxsize' => $component['extra']['filtering']['size'],
      )));
      $file_error = TRUE;
    }
  }

  // Save the file to a temporary location.
  if (!$file_error) {
    $upload_dir = $component['extra']['scheme'] . '://webform/' . $component['extra']['directory'];
    if (file_prepare_directory($upload_dir, FILE_CREATE_DIRECTORY)) {
      $keys = _webform_multifile_convert_files_array($form_key);
      $fids = array();
      foreach ($keys as $key) {
        $file = file_save_upload($key, array(
          'file_validate_extensions' => array(
            implode(' ', $extensions),
          ),
        ), $upload_dir);
        if ($file) {
          @chmod(drupal_realpath($file->uri), 0664);
          $fids[] = $file->fid;
        }
        else {
          drupal_set_message(t('The uploaded file was unable to be saved. The destination directory may not be writable.'), 'error');
        }
      }

      // Set the hidden field value.
      $parents = $element['#array_parents'];
      array_pop($parents);
      $parents[] = '_fids';
      form_set_value(array(
        '#parents' => $parents,
      ), $fids, $form_state);
    }
    else {
      drupal_set_message(t('The uploaded file was unable to be saved. The destination directory does not exist.'), 'error');
    }
  }
}