HTTP से रिमोट सर्वर से इमेज कॉपी करें


83

मैं दूरस्थ सर्वर से PHP का उपयोग कर एक स्थानीय फ़ोल्डर में छवियों को आयात / कॉपी करने का एक सरल तरीका ढूंढ रहा हूं। मेरे पास सर्वर के लिए कोई एफ़टीपी नहीं है, लेकिन सभी दूरस्थ छवियों को HTTP (यानी http://www.mydomain.com/myimage.pg ) के माध्यम से एक्सेस किया जा सकता है ।

उदाहरण का उपयोग करें: एक उपयोगकर्ता अपनी प्रोफ़ाइल में एक छवि जोड़ना चाहता है। छवि पहले से ही वेब पर मौजूद है और उपयोगकर्ता एक सीधा URL प्रदान करता है। मैं छवि को हॉटलाइन करने के लिए नहीं बल्कि अपने डोमेन से आयात और सेवा करने के लिए चाहता हूं।


क्या सर्वर में इसके लिए प्रॉक्सी मॉड्यूल नहीं हैं?
जिग्गंजेर

जवाबों:


155

यदि आपके पास PHP5 और HTTP स्ट्रीम रैपर आपके सर्वर पर सक्षम है, तो इसे स्थानीय फ़ाइल में कॉपी करना अविश्वसनीय रूप से सरल है:

copy('http://somedomain.com/file.jpeg', '/tmp/file.jpeg');

यह किसी भी पाइपलाइन आदि की देखभाल करेगा जिसकी आवश्यकता है। यदि आपको कुछ HTTP पैरामीटर प्रदान करने की आवश्यकता है तो एक तीसरा 'स्ट्रीम संदर्भ' पैरामीटर है जिसे आप प्रदान कर सकते हैं।


33
याद रखें allow_url_fopen को php.ini पर = होना चाहिए।
mauro.dec

3
Allow_url_fopen टिप्पणी सिर्फ एक घंटे के सिर-खरोंच पर हल की गई है। धन्यवाद, @ mauro.dec!
माइकल स्टाकर

2
इस तरह यूआरएल के साथ क्या दान कर रहे हैं http://desmond.imageshack.us/Himg100/scaled.php?server=100&filename=desertoh.jpg&res=crop ???
युसेफरी

इस उत्तर के लिए धन्यवाद - मुझे लगता है कि लगभग वहाँ im! जब आप '/tmp/file.jpg' कहते हैं - वह किसके सापेक्ष है? वेब सर्वर का रूट ... (जैसे: / var / www / vhosts आदि) या वेबसाइट की जड़: / httpdocs / ... ?? कठबोली दिखाई देने वाली फ़ाइलों को देख सकते हैं, और मेरे पास url-fopen ON है। !!
इसका काल

1
Https का उपयोग न करें, बस http
edCoder

31

उपयोग

$imageString = file_get_contents("http://example.com/image.jpg");
$save = file_put_contents('Image/saveto/image.jpg',$imageString);

धन्यवाद दोस्त!! दूसरा समाधान काम कर रहा है .. सभी समाधान में से शीर्ष मेरे लिए काम नहीं कर रहा है: पी
रजनीश

4
छोटी फाइलों के लिए अच्छा टिप, लेकिन बड़ी फ़ाइलों के लिए php मेमोरी में विस्फोट होगा :(
Radon8472

10

PHP में एक अंतर्निहित फ़ंक्शन file_get_contents () है, जो किसी फ़ाइल की सामग्री को स्ट्रिंग में पढ़ता है।

<?php
//Get the file
$content = file_get_contents("http://example.com/image.jpg");

//Store in the filesystem. $fp = fopen("/location/to/save/image.jpg", "w"); fwrite($fp, $content); fclose($fp); ?>

यदि आप फ़ाइल को डेटाबेस में संग्रहीत करना चाहते हैं, तो बस $ सामग्री चर का उपयोग करें और फ़ाइल को डिस्क पर न सहेजें।


2
कर्ल का उपयोग करना एक अच्छा तरीका है 'क्योंकि कुछ सर्वर लोग सुरक्षा कारणों से file_get_contents का समर्थन नहीं करते हैं
Rinto George

1
छोटी फ़ाइलों के लिए अच्छा टिप, लेकिन बड़ी फ़ाइलों के लिए php मेमोरी में विस्फोट होगा :( कर्ल भी कोई अच्छा विकल्प नहीं है, क्योंकि इसकी मानक php का कोई हिस्सा नहीं है
Radon8472

8

आपको इन चार संभावनाओं के बारे में पता चला है:

  • दूरस्थ फ़ाइलेंallow_url_fopenइसे php.ini में सक्षम करने की आवश्यकता है, लेकिन यह सबसे आसान तरीका है।

  • वैकल्पिक रूप से आप cURL का उपयोग कर सकते हैं यदि आपकी PHP स्थापना इसका समर्थन करती है। एक उदाहरण भी है ।

  • और अगर आप वास्तव में इसे करना चाहते हैं तो मैन्युअल रूप से HTTP मॉड्यूल का उपयोग करें ।

  • सीधे सॉकेट्स का उपयोग करने का प्रयास भी न करें ।


"सीधे सॉकेट्स का उपयोग करने का प्रयास भी क्यों न करें?" (जो मैं उपयोग कर रहा हूं, gist.github.com/0893a7ec908ff508aac6 )
गजस

@ गजस: आप उस स्निपेट में सीधे सॉकेट का उपयोग नहीं कर रहे हैं। आप दूरस्थ फ़ाइलों को खोलने के लिए php की क्षमता का उपयोग कर रहे हैं।
जॉर्ज शॉली

4

यहाँ सबसे बुनियादी तरीका है:

$url = "http://other-site/image.png";
$dir = "/my/local/dir/";

$rfile = fopen($url, "r");
$lfile = fopen($dir . basename($url), "w");

while(!feof($url)) fwrite($lfile, fread($rfile, 1), 1);

fclose($rfile);
fclose($lfile);

लेकिन अगर आप बहुत से और बहुत सारे काम कर रहे हैं (या आपका होस्ट ब्लॉक दूरस्थ सिस्टम तक फ़ाइल एक्सेस करता है), तो CURL का उपयोग करने पर विचार करें, जो अधिक कुशल, हल्के से तेज़ और अधिक साझा होस्ट पर उपलब्ध है।

आप बॉट के बजाय डेस्कटॉप की तरह दिखने के लिए उपयोगकर्ता एजेंट को भी खराब कर सकते हैं!

$url = "http://other-site/image.png";
$dir = "/my/local/dir/";
$lfile = fopen($dir . basename($url), "w");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)');
curl_setopt($ch, CURLOPT_FILE, $lfile);

fclose($lfile);
curl_close($ch);

दोनों उदाहरणों के साथ, आप यह सुनिश्चित करने के लिए जीडी के माध्यम से इसे पारित करना चाह सकते हैं कि यह वास्तव में एक छवि है।


1
जीडी के साथ छवि की जाँच करने के लिए, फ़ाइल को सहेजने के बाद इस अधिकार को चलाने पर विचार करें: psoug.org/snippet/Check_if_an_image_exists_GD_364.htm - यदि यह गलत आता है, तो फ़ाइल को तुरंत हटा दें।
ओली

4
आप curl_exec($ch)पहले चूक गए थे curl_close($ch), और पहले की fclose($ch)बजाय अंत में रखा जाना चाहिए curl_close($ch), इसका मतलब है कि फ़ाइल को बंद करें इससे पहले कि फ़ाइल में कुछ भी नहीं लिखा गया है, इसलिए आपको केवल एक खाली फ़ाइल मिलेगी।
हेंद्रा उज़िया

2

यह file_get_contents का उपयोग करके बेहद सरल है । बस पहले पैरामीटर के रूप में url प्रदान करें।


1
यह सुरक्षा कारणों से बहुत सारे साझा मेजबानों पर स्थानीय फाइल सिस्टम के लिए बंद है। CURL बेहतर, तेज, मजबूत, आदि है ... और आमतौर पर उन मेजबानों पर उपलब्ध है जो दूरस्थ फाइल सिस्टम पर fopen को ब्लॉक करते हैं।
ओली

अगर cURL उपलब्ध है, तो यह और भी बेहतर होगा। <a href=" se2.php.net/curl"> cUrl को php.net पर देखें </a>
PatrikAkerstrand

2

फ़ोल्डर बनाएं और इसे नाम दें उदाहरण उदाहरण के लिए खुले नोट पैड डाउनलोड करें और इस कोड को डालें

केवल http://www.google.com/aa.zip को अपनी फ़ाइल में बदलें और उदाहरण के लिए इसे m.php में सहेजें

php फ़ाइल को 666 में चैमोड करें और फ़ोल्डर 777 में डाउनलोड करें

<?php
define('BUFSIZ', 4095);
$url = 'http://www.google.com/aa.zip';
$rfile = fopen($url, 'r');
$lfile = fopen(basename($url), 'w');
while(!feof($rfile))
fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ);
fclose($rfile);
fclose($lfile);
?>

अंत में आपके ब्राउज़र से इन URL में प्रवेश करें http://www.example.com/download/m.php

आप डाउनलोड फ़ोल्डर में अन्य सर्वर से फ़ाइल डाउनलोड देखेंगे

धन्यवाद


0

छवि को डाउनलोड करने और इसे अपने सर्वर पर वेब सुलभ निर्देशिका में सहेजने के लिए GET अनुरोध का उपयोग करें।

जैसा कि आप PHP का उपयोग कर रहे हैं, आप curlअन्य सर्वर से फ़ाइलों को डाउनलोड करने के लिए उपयोग कर सकते हैं ।


0

चूंकि आपने अपना प्रश्न 'php' टैग कर दिया है, इसलिए मैं आपके सर्वर पर आपके php को मान लूंगा। आपकी सबसे अच्छी शर्त यह है कि यदि आप अपने स्वयं के वेब सर्वर को नियंत्रित करते हैं, तो cURL को php में संकलित करें। यह आपके वेब सर्वर को अन्य वेब सर्वरों के लिए अनुरोध करने की अनुमति देगा। यह सुरक्षा के दृष्टिकोण से काफी खतरनाक हो सकता है, इसलिए अधिकांश बेसिक वेब होस्टिंग प्रदाताओं के पास यह विकल्प सक्षम नहीं होगा।

यहाँ cURL का उपयोग करने पर php मैन पेज है । टिप्पणियों में आप एक उदाहरण पा सकते हैं जो डाउनलोड और छवि फ़ाइल है।

यदि आप libcurl का उपयोग नहीं करना चाहते हैं, तो आप fsockopen का उपयोग करके कुछ कोड कर सकते हैं। यह php (लेकिन आपके होस्ट पर अक्षम हो सकता है) में बनाया गया है, और सीधे सॉकेट्स को पढ़ और लिख सकता है। Fsockopen man पेज पर उदाहरण देखें ।


0

उन लोगों के लिए जिन्हें मूल फ़ाइल नाम और एक्सटेंशन को संरक्षित करने की आवश्यकता है

$origin = 'http://example.com/image.jpg';

$filename = pathinfo($origin, PATHINFO_FILENAME);
$ext = pathinfo($origin, PATHINFO_EXTENSION);

$dest = 'myfolder/' . $filename . '.' . $ext;

copy($origin, $dest);

-5

इस जवाब ने मुझे सर्वर से क्लाइंट साइड तक छवि डाउनलोड करने में मदद की।

<a download="original_file.jpg" href="file/path.jpg">
  <img src="file/path.jpg" class="img-responsive" width="600" />
</a>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.