2009-10-29 2 views
2

Drupal 사이트의 대량 업로드 기능을 만드는 중입니다. 플래시를 사용하여 파일을 처리하는 특정 URL로 파일을 업로드 할 수 있습니다. 내가하고 싶은 것은 단지 파일을 업로드하는 것이 아니라 CCK로 설정 한 파일 필드에 저장된 파일로 특정 유형의 노드를 만드는 것입니다. 이 파일들은 오디오 파일이므로 filefield가 파일을 처리하는 것이 중요하므로 getid3 모듈을 사용하여 추가 메타 데이터를 제공 할 수 있습니다.파일 필드가있는 노드 저장

이제 API 설명서를 찾을 수 없어 일부 코드를 살펴 보았지만 어떻게 처리해야하는지 명확하지 않습니다. 이상적으로는 파일을 함수에 전달하고 노드를 저장할 때 반환 된 데이터 만 사용할 수는 있지만 그 함수를 찾을 수 없었습니다.

이 문제에 대해 경험이있는 분이라면이 문제에 대한 접근 방법에 대한 몇 가지 조언을 들으실 수 있습니다.

답변

8

나는 몇 주 전에 비슷한 것을해야했고 Remote File module에서 일부 기능, 특히 remote_file_cck_attach_file() 기능을 채택했습니다. 이 함수는 filefield 모듈의 field_file_save_file() 함수를 사용합니다.이 함수는 찾고있는 함수 일 수 있습니다.

내 경우 파일은 여러 원격 위치에서 가져와 file_save_data()을 사용하여 일시적으로 저장됩니다.

public static function attachAsCCKField(&$node, $filepath, $fieldname, $index=0) { 
    // Grab the filefield definition 
    $field = content_fields($fieldname, $node->type); 
    $validators = array_merge(filefield_widget_upload_validators($field), imagefield_widget_upload_validators($field)); 
    $fieldFileDirectory = filefield_widget_file_path($field); 
    // This path does not necessarily exist already, so make sure it is available 
    self::verifyPath($fieldFileDirectory); 
    $file = field_file_save_file($filepath, $validators, $fieldFileDirectory); 
    // Is the CCK field array already available in the node object? 
    if (!is_array($node->$fieldname)) { 
    // No, add a stub 
    $node->$fieldname=array(); 
    } 
    $node->{$fieldname}[$index] = $file; 
} 

$filepath이 연결해야 파일의 경로, $fieldname 노드와 $index 내에서 사용할 수있는 FileField와 인스턴스의 내부 이름입니다하십시오 CCK의 및 FileField에 부착하는 것은 다음 사용 hook_nodeapi() 프리 세이브에서 발생 여러 개의 필드 항목이있는 경우 첨부 파일의 0 기반 색인이됩니다.

함수는 유틸리티 클래스 내에서 끝났으므로 verifyPath() 호출에 대한 클래스 구문이 사용됩니다. 이 호출은 대상 디렉토리가 사용 가능한지 확인합니다.

public static function verifyPath($path) { 
    if (!file_check_directory($path, FILE_CREATE_DIRECTORY)) { 
    throw new RuntimeException('The path "' . $path . '" is not valid (not creatable, not writeable?).'); 
    } 
} 

그게 나를 위해 해 줬어. 자동으로 노드를 저장하면 다른 일이 생겼어.

아직 getid3 모듈을 사용하지 않았으므로이 방법과 함께 사용할 것인지 잘 모르겠습니다. 또한 파일 필드에 추가 정보/속성을 추가 할 필요가 없으므로 field_file_save_file()에 의해 반환 된 파일보다 필드 배열에 더 많은 정보를 넣어야합니다. 어쨌든, 이것이 도움이되고 행운이 있기를 바랍니다.

+1

field_file_save_file()에 +1하면 시간이 절약되었습니다. –

+0

매우 유망 해 보입니다. 마감 기한이 없다면 즉시 파고 들려고합니다. – googletorp

1

나는 일하는 whith imagefield를 만들었지 만 구조가 올바르지 않으면 제대로 작동하지 않을 것이라고 생각합니다. 많은 시행 착오를 겪었습니다. 이것이 제가 imagefield를 채운 이유입니다.

$image['data'] =array(
      'title' => $media_reference_attributes->getNamedItem("source")->value, 
      'description' => $description, 
      'alt' => "",); 
$image['width'] = $width; 
$image['height'] = $height; 
$image['mimetype'] = $mime_type 
$image['uid'] = 1; 
$image['status'] = 1; 
$image['fid'] = $fid; 
$image['filesize'] = $file->filesize; 
$image['nid'] = $id; 
$image['filename'] = $url; 
$image['timestamp'] = $file->timestamp; 
$image['filepath'] = $file_path; 

희망이 있습니다.

1

플래시 업로드 통합을 살펴 보려면 Image FUpload을 참조하십시오.

Drupal을 통해 파일을 처리하는 동안 파일을 다른 서버로 밀어 넣으려면 CDN 공간과 비슷하지만 CDN 또는 CDN2 프로젝트의 동작을 살펴보십시오.

맑은 해결책을 찾으면 다시 와서 게시하십시오!

+0

이미지 FUpload가 유사합니다.그러나 큰 차이점은 파일 당 노드를 만들고 싶다는 것입니다. 그래서 내가하는 것처럼 할 수없는 것 같습니다. 그것이 도움이 될 수 있는지보기 위해 더 가까이 볼 것입니다. – googletorp