it-swarm.it

Caricamento file Api modulo

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.

9
Lucy

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.
Nota che il file verrà archiviato come file temporaneo, quindi assicurati di impostare lo stato del file su permanente in seguito.

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 archiviare quel percorso in un campo di database personalizzato).

8
zroger

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.

4
Blake Senftner

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.

3
googletorp