Caricamento del file Api del modulo


9

Ho il seguente codice nel mio modulo.

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

Sul gestore di invio, restituisce il nome del file ma non salva il file e restituisce un oggetto file. Cos'altro devo fare?

Quello che sto cercando di fare è creare un blocco in cui è possibile caricare un file che viene salvato nel campo del file di un nodo.

Risposte:


8

Dai un'occhiata a file_save_upload () e alle funzioni che lo chiamano.

La funzione gestirà la convalida del file e lo salverà in una nuova posizione. In Drupal 7 questo aggiunge anche il file alla tabella file_managed.
Si noti che il file verrà archiviato come file temporaneo, quindi assicurarsi di impostare in seguito lo stato del file su permanente.

Probabilmente vorrai implementare la funzione file_save_upload all'interno dell'hook di convalida del modulo (prima del gestore di invio), in modo da poter avvisare l'utente se il caricamento del file non è riuscito o non ha soddisfatto i requisiti di convalida.

Se il nome del campo immagine che si sta tentando di convalidare è image, il primo parametro di file_save_upload dovrebbe essere image, come tale:

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

Questa funzione restituirà quindi il percorso sul server su cui è stata caricata l'immagine (quindi è possibile, ad esempio, memorizzare quel percorso in un campo di database personalizzato).


4

Ti manca questo nella definizione del modulo:

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

Ecco la logica che utilizzo per creare un widget di caricamento file in un modulo:

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

Ed ecco la controparte di quella logica, che ho nel callback validato del mio modulo, perché ho restrizioni di nome file di immagine nella mia logica, ma puoi inserirlo nel callback di invio se vuoi:

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

questo è tutto.


3
In realtà non è necessario $form['#attributes']['enctype']in Drupal 7. Viene curato automaticamente
user724228,

3
non è necessario multipart/form-dataper drupal 7, viene creato in drupal 7 quando si utilizza un campo file.
VOLO

@bsenftner Sto usando lo stesso metodo che sei tu, ma quando lo provo, lo trovo $file === null, il che significa che no file was uploaded(secondo le specifiche: api.drupal.org/api/drupal/includes!file.inc/function / ... ) Cosa devo fare in quel caso? Come posso eseguire il debug di questo tipo di cose?
Shawn,

@Shawn: stai lavorando in Drupal 7? Questa logica è testata per Drupal 6. Non ho ancora avuto la possibilità di provarla su D7, quindi, se sei in D7, allora "Non lo so". Se sei in D6, allora dovrebbe funzionare - sei sicuro che 'fid' sia il nome del campo del tuo widget di caricamento file?
Blake Senftner,

Sì a entrambe le domande: sono sicuro di avere il nome giusto per il widget e sto usando D7. Penso che dovrei farne una nuova domanda ...
Shawn,

3

Ho una funzione di validazione generica che utilizzo principalmente nei temi che devono supportare il caricamento di immagini. Potresti essere in grado di usarlo così o con piccole modifiche, ma questo dovrebbe farti andare lontano.

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

Usando questa funzione, otterrai il percorso del file come valore nel gestore di invio modulo. È possibile che si desideri l'ID file, a seconda dell'utilizzo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.