อัพโหลดไฟล์ Api ในรูปแบบ


9

ฉันมีรหัสต่อไปนี้ในแบบฟอร์มของฉัน

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

ในตัวจัดการการส่งจะส่งคืนชื่อไฟล์ แต่จะไม่บันทึกไฟล์และส่งคืนวัตถุไฟล์ ฉันต้องทำอะไรอีก

สิ่งที่ฉันพยายามทำคือสร้างบล็อกที่คุณสามารถอัปโหลดไฟล์ที่บันทึกไว้ในฟิลด์ไฟล์ของโหนด

คำตอบ:


8

ลองดูที่file_save_upload ()และฟังก์ชั่นที่เรียกมันว่า

ฟังก์ชั่นจะจัดการกับการตรวจสอบความถูกต้องของไฟล์และบันทึกลงในตำแหน่งใหม่ ใน Drupal 7 สิ่งนี้จะเพิ่มไฟล์ไปยังตาราง file_managed
โปรดทราบว่าไฟล์จะถูกเก็บไว้เป็นไฟล์ชั่วคราวดังนั้นโปรดตรวจสอบให้แน่ใจว่าตั้งค่าสถานะของไฟล์เป็นแบบถาวรหลังจากนั้น

คุณอาจต้องการใช้ฟังก์ชั่น file_save_upload ภายใน hook การตรวจสอบความถูกต้องของแบบฟอร์มของคุณ (ก่อนที่จะส่ง handler) ดังนั้นคุณสามารถแจ้งเตือนผู้ใช้ว่าการอัพโหลดไฟล์ล้มเหลวหรือไม่ตรงตามข้อกำหนดการตรวจสอบของคุณ

หากชื่อของฟิลด์รูปภาพที่คุณพยายามตรวจสอบคือimageพารามิเตอร์แรกของ file_save_upload ควรเป็นรูปภาพเช่น:

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

ฟังก์ชั่นนี้จะส่งคืนพา ธ บนเซิร์ฟเวอร์ที่อัพโหลดอิมเมจ (ดังนั้นคุณสามารถเก็บตัวอย่างพา ธ นั้นในฟิลด์ฐานข้อมูลที่กำหนดเองได้)


4

คุณขาดสิ่งนี้ไปในนิยามของแบบฟอร์ม

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

นี่คือตรรกะที่ฉันใช้ในการสร้างวิดเจ็ตอัพโหลดไฟล์ในแบบฟอร์ม:

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

และนี่คือคู่ของตรรกะนั้นซึ่งฉันมีในการโทรกลับตรวจสอบความถูกต้องของแบบฟอร์มของฉันเพราะฉันมีข้อ จำกัด ชื่อไฟล์ภาพในตรรกะของฉัน แต่คุณสามารถวางสิ่งนี้ในการเรียกกลับส่งถ้าคุณต้องการ:

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

แค่นั้นแหละ.


3
จริงๆแล้วคุณไม่ต้องการใช้$form['#attributes']['enctype']Drupal 7 ดูแลโดยอัตโนมัติ
user724228

3
คุณไม่จำเป็นต้องใช้multipart/form-dataสำหรับ drupal 7 มันคือการสร้างใน drupal 7 เมื่อใช้ฟิลด์ไฟล์
FLY

@bsenftner ฉันใช้วิธีการเดียวกับที่คุณเป็น แต่เมื่อฉันลองฉันพบว่า$file === nullซึ่งหมายความว่าno file was uploaded(ตามรายละเอียด: api.drupal.org/api/drupal/includes!file.inc/function / … ) ฉันควรทำอย่างไรในกรณีนี้? ฉันจะแก้ไขข้อบกพร่องของสิ่งนี้ได้อย่างไร
Shawn

@Shawn: คุณทำงานใน Drupal 7 หรือไม่ ตรรกะนี้ได้รับการทดสอบสำหรับ Drupal 6 ฉันยังไม่มีโอกาสลองใช้ D7 เลยดังนั้นถ้าคุณอยู่ใน D7 ถ้าอย่างนั้น "ฉันไม่รู้" หากคุณอยู่ใน D6 มันควรจะใช้ได้ - คุณแน่ใจหรือไม่ว่า 'fid' เป็นชื่อฟิลด์ของวิดเจ็ตการอัพโหลดไฟล์ของคุณ?
เบลค Senftner

ใช่ทั้งสองคำถาม: ฉันแน่ใจว่าฉันมีชื่อที่ถูกต้องสำหรับวิดเจ็ตและฉันใช้ D7 ฉันคิดว่าฉันควรทำให้คำถามนี้เป็นคำถามใหม่ ...
Shawn

3

ฉันมีฟังก์ชั่นการตรวจสอบความถูกต้องทั่วไปที่ฉันใช้เป็นหลักในชุดรูปแบบที่ต้องการสนับสนุนการอัปโหลดรูปภาพ คุณอาจจะสามารถใช้มันได้หรือเปลี่ยนแปลงเล็กน้อย แต่สิ่งนี้น่าจะนำคุณไปได้ไกล

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

ใช้ฟังก์ชั่นนี้คุณจะได้รับ filepath เป็นค่าในตัวจัดการการส่งแบบฟอร์ม คุณอาจต้องการรหัสไฟล์แทนทั้งนี้ขึ้นอยู่กับการใช้งานของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.