मीडिया मॉड्यूल का उपयोग करके बाहरी URL से प्रोग्रामेटिक रूप से छवि कैसे जोड़ें?


20

मैं प्रोग्रामेटिक रूप से बाहरी URL से एक छवि जोड़ना चाहता हूं और मॉड्यूल स्टोर कर सकता हूं और छवि की एक स्थानीय प्रतिलिपि प्रदर्शित कर सकता हूं। मैं उसे कैसे कर सकता हूँ? आम तौर पर, मैं एक नया नोड बनाते समय "चुनिंदा मीडिया" बटन पर क्लिक करता हूं लेकिन मैं इसे कोड के माध्यम से करना चाहता हूं।

जवाबों:


0

यह आपके प्रश्न का आंशिक उत्तर है, क्योंकि मैं कुछ ऐसा ही करने की कोशिश कर रहा हूं, लेकिन वीडियो सामग्री के साथ।

आप नोड को एक सामग्री प्रकार के रूप में बना सकते हैं, मीडिया प्रकार जिसे आपको ज़रूरत है उसे बचाएं (संबंधित माइम / प्रकार और उन फ़ंक्शन के लिए मीडिया कोड के माध्यम से देखें जिन्हें आपको कॉल करने की आवश्यकता है)। आपको संभवतः मल्टीमीडिया परिसंपत्ति फ़ील्ड सेट करने और फ़ील्ड प्रकार में मीडिया फ़ाइल चयनकर्ता का उपयोग करने की आवश्यकता होगी।

बिट मैं एक समस्या के साथ कर रहा हूँ ब्राउज़र बनाया नोड में यह दिखाने के लिए हालांकि, जो मैं वर्तमान में काम कर रहा हूँ।

अपडेट करें

थोड़ा आगे बढ़ गया। एक बार जब आपने मीडिया फ़ाइल (मीडिया एपीआई का उपयोग करके) को सहेज लिया है, फ़ाइल आईडी को file_usage_add () का उपयोग करके नोड आईडी के साथ जोड़ दें । मीडिया परिसंपत्ति क्षेत्र बनाते समय आपको संभवतः उस फ़ील्ड में फ़ाइल को जोड़ना होगा।


आपको file_usage_add () कॉल करने की आवश्यकता नहीं है। आपको बस फ़ाइल को एक फ़ील्ड में जोड़ने की आवश्यकता है जैसे tecjam के उत्तर में दिखाया गया है।
डेव रीड

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_ret_ve_file /7


8
वास्तव में इसके लिए एक बेहतर एपीआई है: system_retrieve_file () $file = system_retrieve_file('http://drupal.org/files/issues/druplicon_2.png', NULL, TRUE, FILE_EXISTS_RENAME);
डेव रीड

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

इस तरह से - मुझे बड़ी फ़ाइलों की समस्या नहीं है।
हगरोनाफोर

1

यह एक सीधा जवाब नहीं है, लेकिन सुनिश्चित करें कि आप पहले से ही फाइलफील्ड स्रोत मॉड्यूल के बारे में जानते हैं , जो सामान्य रूप से छवियों के लिए ऐसा करता है। यह अपनी जरूरतों को स्वयं पूरा कर सकता है; मुझे नहीं पता कि यह मीडिया के लिए उपयोगी है।


0

@Tecjam उत्तर के अतिरिक्त: आपको file_get_contents () के बजाय drupal_http_request () का उपयोग करना चाहिए , यह आपको प्रक्रिया पर अधिक नियंत्रण देता है। लेकिन कुल मिलाकर यह तरीका उम्मीद के मुताबिक काम करता है।


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()उपलब्ध नहीं है वहां सर्वर के साथ समस्याओं से बचा जाता है )?
क्लाइव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.