Форма завантаження файлу 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 ('зображення', ...);

Потім ця функція поверне шлях на сервер, на який було завантажено зображення (ви можете, наприклад, зберегти цей шлях у власному полі бази даних).


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 при використанні файлового поля.
ЛЕТАТИ

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

За допомогою цієї функції ви отримаєте filepath як значення в обробці форми подання форми. Замість цього вам може знадобитися ідентифікатор файлу, залежно від використання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.