Форма Api Загрузка файла

9

У меня есть следующий код в моей форме.

$form['new']['upload'] = array(
  '#type' => 'file',
  '#title' => t(''),
  '#size' => 40,
);

В обработчике отправки он возвращает имя файла, но не сохраняет файл и возвращает объект файла. Что еще мне нужно сделать?

Я пытаюсь создать блок, в который вы можете загрузить файл, сохраненный в поле файла узла.

Люси
источник

Ответы:

8

Посмотрите на file_save_upload () и функции, которые его вызывают.

Функция будет обрабатывать проверку файла и сохранять его в новом месте. В Drupal 7 это также добавляет файл в таблицу file_managed.
Обратите внимание, что файл будет сохранен как временный файл, поэтому обязательно установите постоянный статус файла.

Возможно, вы захотите реализовать функцию file_save_upload в хуке проверки вашей формы (перед обработчиком отправки), чтобы вы могли предупредить пользователя, если загрузка файла не удалась или не соответствует вашим требованиям проверки.

Если имя поля изображения, которое вы пытаетесь проверить, является следующим image, то первым параметром file_save_upload должно быть изображение, как таковое:

$ path = file_save_upload ('image', ...);

Эта функция затем возвращает путь на сервер, на который было загружено изображение (так что вы можете, например, сохранить этот путь в пользовательском поле базы данных).

zroger
источник
4

Вам не хватает этого в определении вашей формы:

   $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.'));
   }

это оно.

Блейк Сефтнер
источник
3
Вы на самом деле не нуждаетесь $form['#attributes']['enctype']в Drupal 7. Это позаботилось автоматически
user724228
3
вам не нужен multipart/form-dataдля drupal 7, это сборка в drupal 7 при использовании файлового поля.
FLY
@bsenftner Я использую тот же метод, что и вы, но когда я пробую его, я нахожу это $file === null, что означает, что no file was uploaded(в соответствии со спецификациями: api.drupal.org/api/drupal/includes!file.inc/function /… ) Что мне делать в этом случае? Как я могу отлаживать подобные вещи?
Шон
@Shawn: ты работаешь в Drupal 7? Эта логика проверена на Drupal 6. У меня еще не было возможности попробовать ее на D7, поэтому, если вы находитесь в D7, тогда «Я не знаю». Если вы находитесь в D6, значит, он должен работать - вы уверены, что 'fid' - это имя поля вашего виджета для выгрузки файлов?
Блейк Сенфтнер
Да, на оба вопроса: я уверен, что у меня есть правильное имя для виджета, и я использую D7. Я думаю, что я должен сделать это новым вопросом ...
Шон
3

У меня есть общая функция проверки, которую я использую в основном в темах, которые должны поддерживать загрузку изображений. Возможно, вы сможете использовать его как есть или с небольшими изменениями, но это должно вас далеко увести.

/**
 * Validate/submit handler used for handling image uploads
 */
function module_upload_image_validate($form, &$form_state) {
  // This is not needed, I use this to use the same validate function
  // for several fields.
  $key = $form['#key'];
  $file = file_save_upload($key, array(
    'file_validate_is_image' => array(),
    'file_validate_extensions' => array('png gif jpg jpeg'),
  ));
  if ($file) {
    // Get the image info to get the correct extension for the uploaded file.
    $info = image_get_info($file->filepath);
    if (file_move($file, 'destination/filename'. $info['extension'], FILE_EXISTS_REPLACE)) {
      // Mark the file for permanent storage.
      file_set_status($file, FILE_STATUS_PERMANENT);
      // Update the files table.
      drupal_write_record('files', $file, 'fid');
      $form_state['values'][$key] = $file->filepath;
    }
    else {
      form_set_error($key, t('Failed to write the uploaded file to the site’s files folder.'));
    }
  }
}

Используя эту функцию, вы получите путь к файлу в качестве значения в обработчике отправки формы. Вы можете захотеть вместо этого идентификатор файла, в зависимости от вашего использования.

googletorp
источник