Unggah File Formulir Api

9

Saya memiliki kode berikut dalam formulir saya.

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

Pada pengendali pengiriman, ia mengembalikan nama file tetapi tidak menyimpan file dan mengembalikan objek file. Apa lagi yang harus saya lakukan?

Apa yang saya coba lakukan adalah membuat blok tempat Anda dapat mengunggah file yang disimpan di bidang file simpul.

Lucy
sumber

Jawaban:

8

Lihatlah file_save_upload () dan fungsi-fungsi yang menyebutnya.

Fungsi ini akan menangani validasi file, dan menyimpannya ke lokasi baru. Dalam Drupal 7 ini juga menambahkan file ke tabel file_managed.
Perhatikan bahwa file tersebut akan disimpan sebagai file sementara, jadi pastikan untuk mengatur status file menjadi permanen setelahnya.

Anda mungkin ingin menerapkan fungsi file_save_upload di dalam kait validasi formulir Anda (sebelum pengatur pengiriman), sehingga Anda dapat memberi tahu pengguna jika unggahan file gagal, atau tidak memenuhi persyaratan validasi Anda.

Jika nama bidang gambar yang Anda coba validasi adalah image, maka parameter pertama dari file_save_upload harus berupa gambar, dengan demikian:

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

Fungsi ini kemudian akan mengembalikan jalur pada server tempat gambar diunggah (jadi Anda dapat menyimpan contoh jalur itu di bidang basis data khusus).

zroger
sumber
4

Anda melewatkan ini dalam definisi formulir Anda:

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

Berikut logika yang saya gunakan untuk membuat widget unggah file pada formulir:

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

Dan ini adalah lawan dari logika itu, yang saya miliki dalam panggilan balik validasi formulir saya, karena saya memiliki batasan nama file gambar dalam logika saya, tetapi Anda dapat menempatkan ini di kirim balik panggilan jika Anda mau:

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

itu dia.

Blake Senftner
sumber
3
Anda sebenarnya tidak perlu $form['#attributes']['enctype']di Drupal 7. Ini dijaga secara otomatis
user724228
3
Anda tidak perlu multipart/form-datauntuk drupal 7, ini dibangun di drupal 7 saat menggunakan bidang file.
FLY
@ Bsenftner Saya menggunakan metode yang sama seperti Anda, tetapi ketika saya mencobanya, saya menemukan itu $file === null, yang berarti bahwa no file was uploaded(sesuai dengan spesifikasi: api.drupal.org/api/drupal/includes!file.inc/function / ... ) Apa yang harus saya lakukan dalam kasus itu? Bagaimana saya bisa men-debug hal semacam ini?
Shawn
@Shawn: apakah Anda bekerja di Drupal 7? Logika ini diuji untuk Drupal 6. Saya belum punya kesempatan untuk mencobanya di D7, jadi, jika Anda berada di D7 maka "Saya tidak tahu". Jika Anda berada di D6, maka itu akan berfungsi - apakah Anda yakin 'fid' adalah nama bidang widget unggah file Anda?
Blake Senftner
Ya untuk kedua pertanyaan: Saya yakin saya punya nama yang tepat untuk widget dan saya menggunakan D7. Saya pikir saya harus membuat ini pertanyaan baru ...
Shawn
3

Saya memiliki fungsi validasi generik yang saya gunakan terutama dalam tema yang perlu mendukung unggahan gambar. Anda mungkin dapat menggunakannya seperti itu, atau dengan perubahan kecil, tetapi ini akan membuat Anda jauh.

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

Dengan menggunakan fungsi ini, Anda akan mendapatkan filepath sebagai nilai di form submit handler. Anda mungkin menginginkan id file sebagai gantinya, tergantung pada penggunaan Anda.

googletorp
sumber