미디어 모듈을 사용하여 프로그래밍 방식으로 외부 URL의 이미지를 추가하는 방법은 무엇입니까?


20

프로그래밍 방식으로 외부 URL에서 이미지를 추가하고 모듈에 이미지의 로컬 사본을 저장하고 표시하려고합니다. 어떻게해야합니까? 일반적으로 새 노드를 만드는 동안 "미디어 선택"단추를 클릭하지만 코드를 통해 수행하려고합니다.

답변:


0

비디오 자료를 사용하여 비슷한 작업을 시도하고 있기 때문에 귀하의 질문에 대한 부분 답변입니다.

노드를 컨텐츠 유형으로 작성하고 필요한 매체 유형을 저장하십시오 (미디어 코드를 통해 호출해야하는 관련 MIME / 유형 및 기능에 대해 살펴보십시오). 멀티미디어 자산 필드를 설정하고 필드 유형에서 미디어 파일 선택기를 사용해야합니다.

내가 문제를 겪고있는 비트는 브라우저를 생성 된 노드에 표시하는 것입니다. 현재 작동하고 있습니다.

최신 정보

조금 더있어. 미디어 API를 사용하여 미디어 파일을 저장 한 후 file_usage_add ()를 사용하여 파일 ID를 노드 ID와 연결하십시오 . 미디어 자산 필드를 만들 때 추가 된 필드에 파일을 연결해야 할 수도 있습니다.


file_usage_add ()를 호출 할 필요는 없습니다. tecjam의 답변에 표시된 것과 같은 필드에 파일을 추가하면됩니다.
Dave Reid

13

php.ini가 allow_url_fopen을 허용하는지 확인하십시오. 그런 다음 모듈에서 다음과 같은 것을 사용할 수 있습니다.

$image = file_get_contents('http://drupal.org/files/issues/druplicon_2.png'); // string
$file = file_save_data($image, 'public://druplicon.png',FILE_EXISTS_REPLACE);

PHP의 file_get_contents () 함수 사용

http://www.php.net/manual/en/function.file-get-contents.php

Drupal API의 file_save_data ()를 사용하십시오.

http://api.drupal.org/api/drupal/includes--file.inc/function/file_save_data/7

그런 다음을 사용하여 호출하고 노드 등에 저장할 수 있어야합니다.

$node = new stdClass;
$node->type = 'node_type';
node_object_prepare($node);
$node->field_image[LANGUAGE_NONE]['0']['fid'] = $file->fid;
node_save($node);

편집하다:

주석에서 지적했듯이 system_retrieve_file 함수를 사용할 수 있습니다 : https://api.drupal.org/api/drupal/modules!system!system.module/function/system_retrieve_file/7 참조


8
실제로 이것에 대한 더 좋은 API가 있습니다 : system_retrieve_file () $file = system_retrieve_file('http://drupal.org/files/issues/druplicon_2.png', NULL, TRUE, FILE_EXISTS_RENAME);
Dave Reid

6

여기 내 작업 예가 있습니다.

$remoteDocPath = 'http://drupal.org/files/issues/druplicon_2.png';
$doc = system_retrieve_file($remoteDocPath, NULL, FALSE, FILE_EXISTS_REPLACE);
$file = drupal_add_existing_file($doc);

$node = new stdClass;
$node->type = 'node_type';
node_object_prepare($node);
$node->field_image[LANGUAGE_NONE]['0']['fid'] = $file->fid;
node_save($node);

function drupal_add_existing_file($file_drupal_path, $uid = 1, $status = FILE_STATUS_PERMANENT) {
  $files = file_load_multiple(array(), array('uri' => $file_drupal_path));
  $file = reset($files);

  if (!$file) {
    $file = (object) array(
        'filename' => basename($file_drupal_path),
        'filepath' => $file_drupal_path,
        'filemime' => file_get_mimetype($file_drupal_path),
        'filesize' => filesize($file_drupal_path),
        'uid' => $uid,
        'status' => $status,
        'timestamp' => time(),
        'uri' => $file_drupal_path,
    );
    drupal_write_record('file_managed', $file);
  }
  return $file;
}

를 사용하여 임시 파일을 system_retrieve_file()만든 다음에 영구 파일로 저장 하는 이유는 무엇 FILE_STATUS_PERMANENT입니까? 사용자 정의 기능의 요점이 보이지 않습니까?
mpdonadio

그런 식으로-큰 파일에는 문제가 없습니다.
hugronaphor

1

이것은 직접적인 대답은 아니지만 일반적으로 이미지에 대해 수행하는 Filefield Sources 모듈 에 대해 알고 있는지 확인하십시오 . 그것은 당신의 필요를 스스로 충족시킬 수 있습니다. 미디어에 유용한 지 모르겠습니다.



0
// This is a PHP function to get a string representation of the image file.
$image = file_get_contents($path); 

// A stream wrapper path where you want this image to reside on your file system including the desired filename.
$destination = 'public://path/to/store/this/image/name.jpg'; 

$file = file_save_data($image, $destination, FILE_EXISTS_REPLACE);

if (is_object($file)) { // if you get back a Drupal $file object, everything went as expected so make the status permenant
  $file->status = 1;
  $file = file_save($file);
}

return $file;

이 방법을 사용해야 할 이유가 있습니까? system_retrieve_file()(이 방법을 모두 사용하고 file_get_contents()사용할 수없는 서버의 문제를 피할 수 있습니까?)
Clive
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.