I'm using the webform_multiple_file module to let users upload files in a webform. There is a second form component in that form. It's a number. I want to change the upload directory, which is defined on webform admin and is 'webform/uploads' in my case. I want the uploaded files to be stored in subfolders named by the number in the second form field. So the upload directory should be s.th. like 'webform/uloads/102'.

I first tried to accomplish it with hook_webform_submission_presave, but I only can change the file id.

Then I found hook_file_presave, which seems to be the perfect function to solve my problem, but now I'm stuck with the question, how to get the value from my form field into the presave function? The only parameter is $file.

Can someone help me on this? Submission- or file-presave? Is it possible to change the file- and upload-directory in hook_webform_submission_presave?


I was able to get the form value with $GLOBALS in hook_file_presave.

$order_number = $GLOBALS['_POST']['submitted']['upload_formular']['upload_wrapper']['bestellnummer'];

Some string-functions on $file->uri do get the split point and first and second part of uri. Append first part with the value of 'bestellnummer' as the subdirectory. Next I create the subdirectory with

file_prepare_directory($newdir, FILE_CREATE_DIRECTORY);

Then I change $file->uri and $file->destination to new URI, and dpm($file) shows, that it's changed. The new directory is created, but the file is still in the original folder after submitting the form.

It seems I'm missing something here...

  • Of course I tried token usage for upload directory, but it didn't work.
    – krabbe
    Aug 12, 2015 at 14:06

1 Answer 1


I finally sorted something out. Now in hook_webform_submission_presave the files are moved into subdirectories named by the value of a number form field. The field is mandatory, so I don't need extra validation in my function.

Here is the code I use in a custom module with plenty of comments, mostly for me to remember what I did.

 * Implements hook_webform_submission_presave().
 * @param $node: The Webform node on which this submission was made
 *        $submission: The Webform submission that is about to be saved to the database
 * - Move uploaded files to subdirectory based on order-id
function custom_module_webform_submission_presave($node, &$submission) {

  if ( 15 == $node->nid) {
    // get ordernumber for subdirectory
    $subdir = $submission->data[4][0];
    // get files from submission and move them one by one
    $upload_files = entity_load('file', $ids = $submission->data[5]);
    foreach ($upload_files as $key => $file) {
      $uri_old = $file->uri;
      // find last '/' in URI to get filename
      $uri_break = strrpos($uri_old, '/') + 1;
      // extract filename
      $file_name = substr($uri_old, $uri_break);
      // replace filename in uri with subdirectory to get new directory
      $new_directory = str_replace($file_name, $subdir, $uri_old);
      // if not already exists create subdirectory
      file_prepare_directory($new_directory, FILE_CREATE_DIRECTORY);
      // move file in new directory and show message
      $moved_file = file_move($file, $new_directory, $replace = FILE_EXISTS_RENAME);
      if ($moved_file) {
        drupal_set_message(t('<i>@file</i> uploaded to server.', array('@file' => $file_name)));

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.