Вам не хватает этого в определении вашей формы:
$form['#attributes']['enctype'] = 'multipart/form-data'; // If this is not here, upload will fail on submit
Вот логика, которую я использую для создания виджета загрузки файлов в форме:
// these give us the file upload widget:
$form['#attributes']['enctype'] = 'multipart/form-data'; // If this is not here, upload will fail on submit
$form['fid'] = array( '#title' => t('Upload image'),
'#type' => 'file',
'#description' => t('Images must be one of jpg, bmp, gif or png formats.'),
);
И вот аналог этой логики, который я имею в проверочном обратном вызове моей формы, потому что у меня есть ограничения имени файла изображения в моей логике, но вы можете поместить это в обратный вызов отправки, если хотите:
// @see: http://api.drupal.org/api/function/file_save_upload/6
// $file will become 0 if the upload doesn't exist, or an object describing the uploaded file
$file = file_save_upload( 'fid' );
error_log( 'file is "'.print_r( $file, true ).'"' );
if (!$file) {
form_set_error('fid', t('Unable to access file or file is missing.'));
}
это оно.
$form['#attributes']['enctype']
в Drupal 7. Это позаботилось автоматически