it-swarm-eu.dev

Nahrání souboru Api souboru

Ve své podobě mám následující kód.

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

V obslužném programu odevzdání vrací název souboru, ale neuloží soubor a nevrátí objekt souboru. Co jiného musím udělat?

Snažím se vytvořit blok, do kterého můžete nahrát soubor, který je uložen v poli souboru uzlu.

9
Lucy

Podívejte se na file_save_upload () a funkce, které jej nazývají.

Funkce bude zpracovávat ověření souboru a uloží jej do nového umístění. V Drupal 7 to také přidá soubor do file_managed tabulky).
Všimněte si, že soubor bude uložen jako dočasný soubor, takže se ujistěte, že jste poté nastavili stav souboru na trvalý.

Pravděpodobně budete chtít implementovat funkci file_save_upload do háčku ověření vašeho formuláře (před obsluhou odeslání), takže můžete uživatele upozornit, pokud selhalo nahrávání souboru nebo nesplnilo vaše požadavky na ověření.

Pokud je název obrazového pole, které se pokoušíte ověřit, image, pak prvním parametrem file_save_upload by měl být image, jako takový:

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

Tato funkce poté vrátí cestu na server, do kterého byl obrázek nahrán (takže ji můžete například uložit do pole vlastní databáze).

8
zroger

Chybí vám to ve vaší definici formuláře:

   $form['#attributes']['enctype'] = 'multipart/form-data'; // If this is not here, upload will fail on submit

Zde je logika, kterou používám k vytvoření widgetu pro nahrávání souborů ve formuláři:

   // 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.'),
                       ); 

A tady je protějšek této logiky, kterou ve svém formuláři ověřuji zpětné volání, protože v mé logice mám omezení názvu souboru obrázku, ale můžete to vložit do zpětného zpětného volání, pokud chcete:

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

a je to.

4
Blake Senftner

Mám obecnou ověřovací funkci, kterou používám především v tématech, která musí podporovat nahrávání obrázků. Možná byste ji mohli použít jako takovou nebo s malými změnami, ale to by vás mělo dostat daleko.

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

Pomocí této funkce získáte filepath jako hodnotu v obslužném programu pro odeslání formuláře. Místo toho můžete chtít ID souboru v závislosti na vašem použití.

3
googletorp