it-swarm-vi.com

Mẫu Api tải lên

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.

9
Lucy

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 dưới dạng tệp tạm thời, do đó 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ý trình), để bạn có thể cảnh báo người dùng nếu tải lên 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).

8
zroger

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ó.

4
Blake Senftner

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.

3
googletorp