Form Api Dosyası yükleme


9

Formumda aşağıdaki kodu var.

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

Gönderme işleyicisinde dosya adını döndürür, ancak dosyayı kaydetmez ve bir dosya nesnesi döndürmez. Başka ne yapmam gerekiyor?

Ne yapmaya çalışıyorum bir düğümün dosya alanına kaydedilen bir dosyayı yükleyebilirsiniz bir blok oluşturmaktır.

Yanıtlar:


8

File_save_upload () ve onu çağıran işlevlere bir göz atın .

İşlev dosyanın doğrulanmasını işler ve yeni bir konuma kaydeder. Drupal 7'de bu da dosyayı file_managed tablosuna ekler.
Dosyanın geçici bir dosya olarak saklanacağını unutmayın, bu nedenle dosyanın durumunu kalıcı olarak ayarladığınızdan emin olun.

Muhtemelen file_save_upload işlevini formunuzun doğrulama kancasına (gönderme işleyicisinden önce) uygulamak isteyeceksiniz, böylece dosya yükleme başarısız olursa veya doğrulama gereksinimlerinizi karşılamıyorsa kullanıcıyı uyarabilirsiniz.

imageDoğrulamaya çalıştığınız görüntü alanının adı şuysa, file_save_upload öğesinin ilk parametresi resim olmalıdır, örneğin:

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

Bu işlev daha sonra görüntünün yüklendiği sunucudaki yolu döndürür (böylece bu yolu özel bir veritabanı alanında saklayabilirsiniz).


4

Form tanımınızda bunu kaçırıyorsunuz:

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

Bir formda dosya yükleme widget'ı oluşturmak için kullandığım mantık:

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

Ve işte bu mantığın karşılığı, formumun onaylama geri çağrısında var, çünkü mantığımda görüntü dosya adı kısıtlamaları var, ancak bunu isterseniz geri gönderme geri gönderisine yerleştirebilirsiniz:

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

bu kadar.


3
Aslında $form['#attributes']['enctype']Drupal 7'ye ihtiyacınız yok . Otomatik olarak halledilir
user724228 15:11

3
multipart/form-datadrupal 7 için gerek yoktur, Bir dosya alanı kullanırken drupal 7'de oluşturulur.
FLY

@bsenftner Sizinle aynı yöntemi kullanıyorum, ama denediğimde, bunu buluyorum $file === null, yani no file was uploaded(özelliklerine göre: api.drupal.org/api/drupal/includes!file.inc/function /… ) Bu durumda ne yapmalıyım? Bu tür bir şeyi nasıl ayıklayabilirim?
Shawn

@Shawn: Drupal 7'de mi çalışıyorsunuz? Bu mantık Drupal 6 için test edildi. Henüz D7'de denemek için bir şansım olmadı, bu yüzden D7'deyseniz "Bilmiyorum". D6'daysanız, o zaman çalışıyor olmalıdır - 'fid'in dosya yükleme widget'ınızın alan adı olduğundan emin misiniz?
Blake Senftner

Her iki soruya da evet: Widget için doğru isme sahip olduğumdan eminim ve D7 kullanıyorum. Sanırım bunu yeni bir soru yapmalıyım ...
Shawn

3

Öncelikle görüntülerin yüklenmesini desteklemesi gereken temalarda kullandığım genel bir doğrulama işlevim var. Onu olduğu gibi veya küçük değişikliklerle kullanabilirsiniz, ancak bu sizi daha da ileri götürmelidir.

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

Bu işlevi kullanarak, dosya yolunu form gönderme işleyicisindeki değer olarak alırsınız. Kullanımınıza bağlı olarak bunun yerine dosya kimliğini isteyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.