Ви не вистачаєте цього у своєму визначенні форми:
$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. Про це подбає автоматично