จะเพิ่มรูปภาพจาก URL ภายนอกโดยใช้โปรแกรมโดยใช้โมดูลสื่อได้อย่างไร


20

ฉันต้องการเพิ่มรูปภาพจาก URL ภายนอกโดยทางโปรแกรมและมีที่เก็บโมดูลและแสดงสำเนาของรูปภาพในเครื่อง ฉันจะทำสิ่งนั้นได้อย่างไร โดยปกติฉันจะคลิกปุ่ม "เลือกสื่อ" ในขณะที่สร้างโหนดใหม่ แต่ฉันต้องการที่จะทำผ่านรหัส

คำตอบ:


0

นี่เป็นคำตอบบางส่วนสำหรับคำถามของคุณเนื่องจากฉันพยายามทำสิ่งที่คล้ายกัน แต่มีเนื้อหาวิดีโอ

คุณสามารถสร้างโหนดเป็นชนิดเนื้อหาบันทึกชนิดสื่อบันทึกที่คุณต้องการ (ดูรหัสสื่อสำหรับ mime / type และฟังก์ชั่นที่เกี่ยวข้องที่คุณต้องการเรียกใช้) คุณอาจจำเป็นต้องตั้งค่าฟิลด์เนื้อหามัลติมีเดียและใช้ตัวเลือกไฟล์สื่อในประเภทฟิลด์

สิ่งที่ฉันมีปัญหาคือการนำเบราว์เซอร์มาแสดงในโหนดที่สร้างขึ้นซึ่งฉันกำลังทำงานอยู่

UPDATE

ต้องได้รับเพิ่มเติมเล็กน้อย เมื่อคุณได้บันทึกไฟล์มีเดีย (โดยใช้สื่อ API) เชื่อมโยง ID ไฟล์ที่มี ID โหนดใช้file_usage_add () คุณอาจต้องเชื่อมโยงไฟล์ในฟิลด์ที่เพิ่มเมื่อคุณสร้างฟิลด์เนื้อหาสื่อ


คุณไม่จำเป็นต้องโทรหา 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);

ใช้ฟังก์ชั่น file_get_contents () ของ php

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

จากนั้นใช้ file_save_data ของ Drupal API ()

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()ไม่มีให้บริการ)
ไคลฟ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.