Formularz przesyłania pliku Api

9

W moim formularzu mam następujący kod.

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

W module obsługi przesyłania zwraca nazwę pliku, ale nie zapisuje pliku i nie zwraca obiektu pliku. Co jeszcze muszę zrobić?

To, co próbuję zrobić, to utworzyć blok, w którym możesz przesłać plik, który jest zapisany w polu pliku węzła.

Lucy
źródło

Odpowiedzi:

8

Spójrz na file_save_upload () i funkcje, które ją wywołują.

Funkcja zajmie się sprawdzaniem poprawności pliku i zapisze go w nowej lokalizacji. W Drupal 7 powoduje to także dodanie pliku do tabeli zarządzanej przez plik.
Pamiętaj, że plik zostanie zapisany jako plik tymczasowy, więc pamiętaj, aby później ustawić status pliku na stały.

Prawdopodobnie będziesz chciał zaimplementować funkcję file_save_upload w haczyku sprawdzania poprawności formularza (przed procedurą obsługi przesyłania), abyś mógł ostrzec użytkownika, jeśli przesyłanie pliku nie powiedzie się lub nie spełnił twoich wymagań sprawdzania poprawności.

Jeśli nazwa pola obrazu, które próbujesz sprawdzić image, to pierwszym parametrem file_save_upload powinien być obraz, jako taki:

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

Ta funkcja zwróci następnie ścieżkę na serwerze, na który został przesłany obraz (dzięki czemu można na przykład zapisać tę ścieżkę w niestandardowym polu bazy danych).

zroger
źródło
4

Brakuje tego w definicji formularza:

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

Oto logika, której używam do utworzenia widgetu przesyłania plików w formularzu:

   // 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 oto odpowiednik tej logiki, którą mam w moim formularzu sprawdzania poprawności wywołania zwrotnego, ponieważ w mojej logice mam ograniczenia nazwy pliku obrazu, ale możesz umieścić to w wywołaniu zwrotnym przesyłania, jeśli chcesz:

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

Otóż ​​to.

Blake Senftner
źródło
3
Tak naprawdę nie potrzebujesz $form['#attributes']['enctype']w Drupal 7. Zajmuje się to automatycznie
user724228,
3
nie potrzebujesz multipart/form-datadla Drupala 7, jest on wbudowany w Drupala 7, gdy używasz pola pliku.
FLY
@bsenftner Używam tej samej metody, co ty, ale kiedy ją wypróbuję, znajduję to $file === null, co oznacza, że no file was uploaded(zgodnie ze specyfikacją: api.drupal.org/api/drupal/include!file.inc/function /… ) Co powinienem zrobić w takim przypadku? Jak mogę debugować tego rodzaju rzeczy?
Shawn,
@Shawn: pracujesz w Drupal 7? Ta logika jest testowana dla Drupala 6. Nie miałem jeszcze okazji wypróbować jej na D7, więc jeśli jesteś w D7, to „nie wiem”. Jeśli korzystasz z D6, to powinno działać - czy na pewno „fid” to nazwa pola widżetu do przesyłania plików?
Blake Senftner,
Tak na oba pytania: Jestem pewien, że mam odpowiednią nazwę widżetu i używam D7. Myślę, że powinienem uczynić to nowym pytaniem ...
Shawn,
3

Mam ogólną funkcję sprawdzania poprawności, której używam głównie w motywach, które muszą obsługiwać przesyłanie zdjęć. Możesz być w stanie używać go jako takiego lub z drobnymi zmianami, ale to powinno doprowadzić cię 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.'));
    }
  }
}

Korzystając z tej funkcji, otrzymasz ścieżkę do pliku jako wartość w formularzu procedury obsługi przesyłania. Możesz zamiast tego chcieć identyfikator pliku, w zależności od użycia.

googletorp
źródło