Hochladen der API-Datei

9

Ich habe den folgenden Code in meinem Formular.

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

Auf dem Übermittlungshandler wird der Dateiname zurückgegeben, die Datei wird jedoch nicht gespeichert und ein Dateiobjekt zurückgegeben. Was muss ich noch tun?

Ich versuche, einen Block zu erstellen, in den Sie eine Datei hochladen können, die im Dateifeld eines Knotens gespeichert ist.

Lucy
quelle

Antworten:

8

Schauen Sie sich file_save_upload () und die Funktionen an, die es aufrufen.

Die Funktion übernimmt die Validierung der Datei und speichert sie an einem neuen Speicherort. In Drupal 7 wird die Datei auch zur Tabelle file_managed hinzugefügt.
Beachten Sie, dass die Datei als temporäre Datei gespeichert wird. Stellen Sie daher sicher, dass Sie den Status der Datei anschließend auf permanent setzen.

Möglicherweise möchten Sie die Funktion file_save_upload im Validierungs-Hook Ihres Formulars (vor dem Submit-Handler) implementieren, damit Sie den Benutzer benachrichtigen können, wenn der Datei-Upload fehlgeschlagen ist oder Ihre Validierungsanforderungen nicht erfüllt hat.

Wenn der Name des Bildfelds, das Sie imageüberprüfen möchten, lautet , sollte der erste Parameter von file_save_upload image sein, und zwar als solches:

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

Diese Funktion gibt dann den Pfad auf dem Server zurück, auf den das Bild hochgeladen wurde (so können Sie diesen Pfad beispielsweise in einem benutzerdefinierten Datenbankfeld speichern).

zroger
quelle
4

Sie vermissen dies in Ihrer Formulardefinition:

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

Hier ist die Logik, mit der ich ein Widget zum Hochladen von Dateien in einem Formular erstelle:

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

Und hier ist das Gegenstück zu dieser Logik, die ich im Validierungsrückruf meines Formulars habe, weil meine Logik Einschränkungen hinsichtlich des Dateinamens von Bildern enthält. Sie können dies jedoch in den Rückruf zum Senden einfügen, wenn Sie möchten:

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

das ist es.

Blake Senftner
quelle
3
Sie brauchen $form['#attributes']['enctype']in Drupal 7 eigentlich nichts . Es wird automatisch
erledigt
3
Sie benötigen das multipart/form-datafür Drupal 7 nicht. Es wird in Drupal 7 erstellt, wenn Sie ein Dateifeld verwenden.
FLIEGEN
@bsenftner Ich verwende die gleiche Methode wie Sie, aber wenn ich sie ausprobiere, finde ich das $file === null, was bedeutet no file was uploaded(gemäß den Spezifikationen: api.drupal.org/api/drupal/includes!file.inc/function) /… ) Was soll ich in diesem Fall tun? Wie kann ich so etwas debuggen?
Shawn
@Shawn: arbeitest du in Drupal 7? Diese Logik wurde für Drupal 6 getestet. Ich hatte noch keine Gelegenheit, sie auf D7 zu testen. Wenn Sie also in D7 sind, dann "Ich weiß nicht". Wenn Sie in D6 sind, sollte es funktionieren - sind Sie sicher, dass "fid" der Feldname Ihres Datei-Upload-Widgets ist?
Blake Senftner
Ja zu beiden Fragen: Ich bin sicher, ich habe den richtigen Namen für das Widget und verwende D7. Ich denke, ich sollte dies eine neue Frage stellen ...
Shawn
3

Ich habe eine generische Validierungsfunktion, die ich hauptsächlich in Themen verwende, die das Hochladen von Bildern unterstützen müssen. Möglicherweise können Sie es so oder mit geringfügigen Änderungen verwenden, aber dies sollte Sie weit bringen.

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

Mit dieser Funktion erhalten Sie den Dateipfad als Wert im Formularübermittlungshandler. Abhängig von Ihrer Verwendung möchten Sie möglicherweise stattdessen die Datei-ID.

googletorp
quelle