Vlastný upload cez FAPI

Forms API(FAPI) majú typ 'file', ktorý umožňuje nahrať súbor na server. Bohužiaľ musím povedať, že keď som hľadal nejaké bližšie informácie, tak som takmer nič nenašiel a väčšina bola venovaná D5. Takže po chvíľke trápenia sa som konečne prišiel na to, ako si spraviť vlastný upload. Konkrétne som potreboval nahrávať obrázky.

Forma obsahujúca upload musí mať enctype atribút, takže do vašej formy dopíšte:

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

Následne si do vašej submit funkcie dopíšte funkciu file_save_upload(), ktorá je v D6 hlavnou funkciou pre prácu so súbormi. Táto funkcia má niekoľko argumentov

file_save_upload($source, $validators = array(), $dest = FALSE, $replace = FILE_EXISTS_RENAME):

  • $source - názov položky file vo vašej forme
  • $validators - pole so zoznamom kontrolných funkcií ako indexmi a ich argumentmi ako hodnotami
  • $dest - cesta, kam sa má súbor uložiť. Ak sa do cieľovej zložky nedá zapisovať, prípadne neexistuje, súbor sa uloží do temp zložky
  • $replace - ak existuje súbor v cieľovej zložke s rovnakým názvom, TRUE ho prepíše, FALSE premenuje nový súbor

Takže pre nahratie súboru sú nutné tieto kroky:

  1. Do formy s file prvkom je nutné pridať nový atribút enctype s hodnotou multipart/form-data,
  2. Do submit funkcie je nutné pridať funkciu file_check_directory() s nastavením $mode = 1, ktorá skontroluje existenciu cieľovej zložky a v prípade, že neexistuje, ju vytvorí($mode = 1), aby sa súbor neuložil do temp zložky,
  3. Vytvoríť objekt $file, cez funkciu fiel_save_upload(). Tejto funkcii je dobré predať aj nejaké kontrolné funkcie, napríklad na zistenie, či sa jedná o obrázok(file_validate_is_image), prípadne na obmedzenie rozlíšenia obrázku(file_validate_image_resolution) a podobne,
  4. Taktiež do submit funkcie treba pridať funkciu file_set_status(), ktorá nastaví súboru status na 1, aby sa súbor pri mazaní cache nezmazal, resp takýto súbor nie je uložený na trvalo

Takže vo finále by to celé malo vyzerať nejak takto:

function test_form(&$form_state) {
  $vars = variable_get('my_image', array());
  if ($vars['filepath']) {
    $form['preview'] = array(
      '#type' => 'markup',
      '#value' => '<img src="/'. $vars['filepath'] .'" />',
    );
  }
  $form['image'] = array(
    '#type' => 'file',
    '#title' => t('Image'),
    '#description' => t('Graphical representation of something. Allowed types are: <b>jpg</b>, <b>png</b> and <b>gif</b>.'),
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
    '#submit' => array('test_save_image'),
  );
  if ($vars['filepath']) {
    $form['delete'] = array(
      '#type' => 'submit',
      '#value' => t('Delete image'),
      '#submit' => array('test_delete_image'),
    );
  }
  $form['#attributes']['enctype'] = 'multipart/form-data';
 
  return $form;
}
 
 
function test_save_image($form, &$form_state) {
  $dir = file_directory_path() .'/img/something';
  file_check_directory(&$dir, $mode = 1, $form_item = NULL);
  $validators = array(
    'file_validate_is_image' => array(),
    'file_validate_image_resolution' => array('300x300'),
  );
  if ($file = file_save_upload('image', $validators, $dir, FILE_EXISTS_REPLACE)) {
    file_set_status(&$file, 1);
    $vars = variable_get('my_image', array());
    // Ak existuje starý obrázok, zmaže sa.
    if ($vars['filepath']) {
      db_query("DELETE FROM {files} WHERE fid = %d", $vars['fid']);
      file_delete($vars['filepath']);
    }
    $vars['filepath'] = $file->destination;
    $vars['fid'] = $file->fid;
    variable_set('my_image', $vars);
  }
}
 
 
function test_delete_image($form, &$form_state) {
  $vals = variable_get('my_image', array());
  db_query("DELETE FROM {files} WHERE fid = %d", $vals['fid']);
  file_delete($vals['filepath']);
  unset($vals['filepath']);
  unset($vals['fid']);
  variable_set('my_image', $vals);
}

Poslať nový komentár

Obsah tohto poľa je súkromný a nebude verejne zobrazený. If you have a Gravatar account, used to display your avatar.
© Ivan Jaroš. Podmienky použitia. Šírenie obsahu bez súhlasu je zakázané. Hosting poskytuje WebSupport.