양식 API 파일 업로드


9

내 양식에 다음 코드가 있습니다.

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

제출 핸들러에서 파일 이름을 리턴하지만 파일을 저장하지 않고 파일 오브젝트를 리턴하지 않습니다. 다른 무엇을해야합니까?

내가하려고하는 것은 노드의 파일 필드에 저장된 파일을 업로드 할 수있는 블록을 만드는 것입니다.

답변:


8

file_save_upload ()와이 를 호출하는 함수를 살펴보십시오 .

이 기능은 파일의 유효성 검사를 처리하여 새 위치에 저장합니다. Drupal 7에서는 파일을 file_managed 테이블에 추가합니다.
파일은 임시 파일로 저장되므로 나중에 파일 상태를 영구적으로 설정해야합니다.

양식의 유효성 검증 후크 (제출 핸들러 이전) 내에 file_save_upload 함수를 구현하여 파일 업로드에 실패했거나 유효성 검증 요구 사항을 충족하지 않은 경우 사용자에게 경고 할 수 있습니다.

검증하려는 이미지 필드의 이름이 인 경우 imagefile_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']드루팔 7에서 자동으로 알아서 것
user724228

3
multipart/form-datadrupal 7 에는 필요하지 않습니다 . 파일 필드를 사용할 때 drupal 7에 빌드됩니다.
FLY

@ bsenftner 나는 당신과 같은 방법을 사용하고 있지만, 그것을 시도 할 때, 그것은 (사양에 따라 api.drupal.org/api/drupal/includes!file.inc/function$file === null 을 의미합니다 no file was uploaded. / ... )이 경우 어떻게해야합니까? 이런 종류의 것을 어떻게 디버깅 할 수 있습니까?
Shawn

@Shawn : Drupal 7에서 일하고 있습니까? 이 논리는 Drupal 6에서 테스트되었습니다. 아직 D7에서 시도해 볼 기회가 없었으므로 D7에 있다면 "모르겠습니다". D6에 있다면 작동해야합니다. 'fid'가 파일 업로드 위젯의 필드 이름입니까?
Blake 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.'));
    }
  }
}

이 함수를 사용하면 파일 제출을 양식 제출 핸들러의 값으로 가져옵니다. 사용법에 따라 대신 파일 ID를 원할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.