How can I get the right value to use in $file = file_save_upload($public_file, $validators, 'public://', FILE_EXISTS_REPLACE);

$public_file = $form_state['input']['files']['public_file'];

This upload field comes in the form via an ajax request so it comes in $form_state['input']['files']['public_file'] according to DSM. But when I do this it doesn't work.

I only got this function to work when the public_file is in the base of a form $form['public_file'] and entering public_file in the first value of file_save_upload.

But that isn't possible this way because of the ajax generated form.

If anyone knows how to get this value I would be very thankful. My code is below:

function push_notifications_edit_app_form_submit($form, &$form_state) {
    $title = $form_state['input']['title']['changethis'];
    $app_id = $form_state['input']['edit']['app_id'];
    $gcm = $form_state['input']['edit']['GCM'];
    // $ios = $form_state['input']['edit']['iOS'];
    // $ios = $form_state['input']['hidden_ios'];
    $oldid = $form_state['input']['oldid'];
    $ios_mode = $form_state['input']['edit']['ios_mode'];
    $public_file = $form_state['input']['files']['public_file'];

    $validators = array('file_validate_extensions' => array('pem'));
    $file = file_save_upload($public_file, $validators, 'public://', FILE_EXISTS_REPLACE);
    $ios = $file->filename;
    if ($file) {
        drupal_set_message(t('Thank you for uploading private file. You can download it from @url',
        array('@url' => file_create_url($file->uri))));
    $query = db_update('push_notifications_api')
               'app_id' => $app_id,
               'GCM' => $gcm,
               'ios' => 'hoi',
               'ios_mode' => $ios_mode,
        ->condition('app_id', $oldid)
    drupal_set_message(t('@title has been updated succesfully.', array('@title' => $title))); 

And in the _form function:

$form['#attributes']['enctype'] = 'multipart/form-data';

$form['replace_textfield']['public_file'] = array(
    '#type' => 'file',
    '#title' => t('iOS Certificate File (.pem)'),
    '#description' => t('Upload your iOS certificate file here. Currently you are using: <strong>@cert</strong>', array('@cert' => $ios_key)),
    '#weight' => 35,

$form['replace_textfield']['edit']['ios_mode'] = array(
    '#type' => 'select',
    '#title' => 'APNS Environment',
    '#description' => 'Select the active APNS Environment. Please note that development certificates do not work with apps released in the Apple app store; production certificates only work with apps released in the app store.',
    '#options' => array(
        'prod' => 'Production',
        'dev' => 'Development',
    '#weight' => 40,
    '#value' => $ios_mode,

$form['replace_textfield']['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Edit',
    '#weight' => 40,
  • Your post is vague. Try editing it and explicitly state your workaround. Apr 23, 2015 at 9:27
  • I just need the file_save_upload to work. It works when the file type is in the form like: $form['public_file'] and when I use "public_file" in file_save_upload. But I need it to work when my ['public_file'] is in a form like $form['replace_textfield']['public_file']. Apr 23, 2015 at 9:29


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.