Mẫu Api tải lên


9

Tôi có mã sau đây trong mẫu của tôi.

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

Trên trình xử lý đệ trình, nó trả về tên tệp nhưng nó không lưu tệp và trả về một đối tượng tệp. Tôi cần làm gì khác?

Những gì tôi đang cố gắng làm là tạo một khối nơi bạn có thể tải lên một tệp mà nó được lưu trong trường tệp của một nút.

Câu trả lời:


8

Hãy xem file_save_upload () và các hàm gọi nó.

Hàm sẽ xử lý xác nhận tệp và lưu nó vào một vị trí mới. Trong Drupal 7, điều này cũng thêm tệp vào bảng file_managed.
Lưu ý rằng tệp sẽ được lưu trữ dưới dạng tệp tạm thời, vì vậy hãy đảm bảo đặt trạng thái của tệp thành vĩnh viễn sau đó.

Bạn có thể sẽ muốn triển khai hàm file_save_upload bên trong móc xác thực của biểu mẫu của bạn (trước trình xử lý gửi), để bạn có thể cảnh báo người dùng nếu tải tệp không thành công hoặc không đáp ứng các yêu cầu xác thực của bạn.

Nếu tên của trường hình ảnh bạn đang cố xác thực là image, thì tham số đầu tiên của file_save_upload phải là hình ảnh, như vậy:

$ path = file_save_upload ('hình ảnh', ...);

Hàm này sau đó sẽ trả về đường dẫn trên máy chủ mà hình ảnh được tải lên (ví dụ bạn có thể lưu đường dẫn đó trong trường cơ sở dữ liệu tùy chỉnh).


4

Bạn đang thiếu điều này trong định nghĩa biểu mẫu của bạn:

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

Đây là logic tôi sử dụng để tạo tiện ích tải lên tệp trên một biểu mẫu:

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

Và đây là bản sao của logic đó, mà tôi có trong hàm gọi lại hợp lệ của biểu mẫu của tôi, bởi vì tôi có các hạn chế tên tệp hình ảnh trong logic của mình, nhưng bạn có thể đặt nó trong phần gọi lại nếu bạn muốn:

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

đó là nó.


3
Bạn thực sự không cần $form['#attributes']['enctype']trong Drupal 7. Nó được chăm sóc tự động
user724228

3
bạn không cần multipart/form-datacho drupal 7, Nó được xây dựng trong drupal 7 khi sử dụng một trường tập tin.
FLY

@bsenftner Tôi đang sử dụng cùng một phương pháp như bạn, nhưng khi tôi dùng thử, tôi thấy điều $file === nullđó có nghĩa là no file was uploaded(theo thông số kỹ thuật: api.drupal.org/api/drupal/includes!file.inc/f ghép / Vắc ) Tôi nên làm gì trong trường hợp đó? Làm thế nào tôi có thể gỡ lỗi loại điều này?
Shawn

@Shawn: bạn đang làm việc trong Drupal 7? Logic này đã được thử nghiệm cho Drupal 6. Tôi chưa có cơ hội dùng thử trên D7, vì vậy, nếu bạn ở D7 thì "Tôi không biết". Nếu bạn đang ở D6, thì nó sẽ hoạt động - bạn có chắc chắn 'fid' là tên trường của tiện ích tải lên tệp của bạn không?
Blake Senftner

Có cho cả hai câu hỏi: Tôi chắc chắn rằng tôi đã đặt đúng tên cho tiện ích và tôi đang sử dụng D7. Tôi nghĩ rằng tôi nên đặt câu hỏi này mới ...
Shawn

3

Tôi có một chức năng xác nhận chung mà tôi sử dụng chủ yếu trong các chủ đề cần hỗ trợ tải lên hình ảnh. Bạn có thể sử dụng nó như nó hoặc với những thay đổi nhỏ, nhưng điều này sẽ giúp bạn tiến xa.

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

Sử dụng chức năng này, bạn sẽ nhận được filepath làm giá trị trong trình xử lý biểu mẫu. Bạn có thể muốn id tệp thay vào đó, tùy thuộc vào cách sử dụng của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.