2013-09-05 12 views
5

मैंने अमेज़ॅन एस 3 के लिए एक हस्ताक्षरित $ यूआरएल बनाया है और यह ब्राउज़र में पूरी तरह से खुलता है।जांचें कि क्या अमेज़ॅन एस 3 पर हस्ताक्षर किए गए हस्ताक्षर किए गए यूआरएल

http://testbucket.com.s3.amazonaws.com/100-game-play-intro-1.m4v?AWSAccessKeyId=AKIAJUAjhkhkjhMO73BF5Q&Expires=1378465934&Signature=ttmsAUDgJjCXepwEXvl8JdFu%2F60%3D 

** बाल्टी नाम और accesskey इस उदाहरण

लेकिन मैं तो (कर्ल का प्रयोग करके) कि फ़ाइल मौजूद है की जाँच करने के लिए नीचे दिए गए समारोह का उपयोग करने के कोशिश कर रहा हूँ में बदल दिया है। यह कर्ल कनेक्शन विफल रहता है। यदि मैं एस 3 के बाहर किसी छवि के यूआरएल के साथ उपरोक्त $ यूआरएल को प्रतिस्थापित करता हूं तो यह कोड पूरी तरह से काम करता है।

मैं जानता हूँ कि फ़ाइल अमेज़न में मौजूद है, लेकिन बाहर काम नहीं कर सकता क्यों इस कोड अगर विफल रहता है

कोई भी विचार ऊपर के रूप में एक हस्ताक्षर किए यूआरएल का उपयोग कर?

धन्यवाद

यहां मेरा कोड है।

function remoteFileExists($url) { 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 

    //don't fetch the actual file, only get header to check if file exists 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 

    $result = curl_exec($ch); 
    curl_close($ch); 



    if ($result !== false) { 

     $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

     if ($statusCode == 200) { 
      $ret = true; 
     } else { 
      $ret = false; 
     } 

    } else { 
     $ret='connection failed'; 
    } 

    return $ret; 

} 
+0

जब मैं इस कोड का उपयोग यह जांचने के लिए करता हूं कि फ़ाइल हस्ताक्षरित यूआरएल के साथ एस 3 पर मौजूद है या नहीं, क्योंकि यह एक निजी बाल्टी है (यानी कोई सार्वजनिक नीति नहीं है) यह हमेशा 'कनेक्शन विफल' के साथ विफल रहता है जो कि कर्ल कनेक्शन स्वयं विफल रहा है। –

+0

क्षमा करें मैं इसे आसानी से एडब्ल्यूएस PHP एसडीके के साथ हल कर रहा हूं लेकिन मैं इसे एसडीके के बिना काम करने की कोशिश कर रहा हूं क्योंकि मैं एक वर्डप्रेस प्लगइन में कार्यक्षमता जोड़ रहा हूं। धन्यवाद –

उत्तर

4

जब CURLOPT_NOBODY का उपयोग कर, libcurl एक HTTP HEAD अनुरोध है, न कि GET अनुरोध भेजता है।

... स्ट्रिंग हस्ताक्षर किए जाने बाकी क्रिया, सामग्री md5 मूल्य, सामग्री प्रकार मूल्य जोड़कर बनाई है, समाप्त हो रहा है पैरामीटर मान, canonicalized एक्स AMZ हेडर (नीचे नुस्खा देखें), और संसाधन; सभी न्यूलाइन से अलग हो गए।

http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html

"बाकी क्रिया" - जैसे, GET बनाम HEAD - हस्ताक्षर आप उत्पन्न, और अनुरोध है कि बनाने के लिए, तो एक हस्ताक्षर है कि के लिए मान्य है के बीच अनुरूप होना चाहिए GETHEAD और इसके विपरीत के लिए मान्य नहीं होगा।

इस तरह से फ़ाइल को सत्यापित करने के लिए आपको GET अनुरोध के बजाय HEAD अनुरोध पर हस्ताक्षर करने की आवश्यकता होगी।

+0

उत्तर के लिए धन्यवाद। मेरे शोध से लगता है कि एसडीके का उपयोग न करने की मेरी आवश्यकता को देखते हुए यह सही उत्तर है। ऐसा कहकर, मैंने अब एसडीके को प्लगइन में कार्यान्वित किया है क्योंकि यह सबसे मजबूत समाधान की तरह लगता है और मैं संभवतः अन्य कार्यक्षमताओं तक पहुंच प्रदान करता हूं। एक बार फिर धन्यवाद। –

संबंधित मुद्दे