2009-04-21 21 views
5

पर संग्रहीत किए बिना ब्राउज़र में एक एस 3 फ़ाइल डाउनलोड करना चाहता हूं मुझे अमेज़ॅन के एस 3 पर फाइलें मिली हैं। उन्हें एक अद्वितीय आईडी के साथ नामित किया गया है, इसलिए कोई डुप्लिकेट नहीं है। मैं एक अधिकृत यूआरएल का उपयोग कर उन्हें एक्सेस कर रहा हूं। मुझे ब्राउज़र में उन्हें पास करने में सक्षम होना चाहिए, लेकिन मुझे उनका नाम बदलने की जरूरत है। अभी मैं फॉपेन का उपयोग कर रहा हूं, लेकिन यह ब्राउज़र में फ़ाइल की सेवा करने से पहले मेरे सर्वर पर फ़ाइल डाउनलोड कर रहा है। ब्राउज़र में मेरे सर्वर को 'से गुजरने वाली फाइलें' कैसे हो सकती हैं? या मैं डाउनलोड को कैसे बफर कर सकता हूं - मेरे सर्वर पर एक छोटा सा हिस्सा डाउनलोड कर रहा हूं और अगले खंड को डाउनलोड करते समय ब्राउजर को पास कर सकता हूं?PHP में, मैं अपने सर्वर

इसके अलावा - मैं वास्तव में क्लाउडफ्रंट का उपयोग करना चाहता हूं लेकिन वे प्रमाणीकृत यूआरएल की पेशकश नहीं करते हैं। मेरा मानना ​​है कि मैं अनुरोध के लिए प्रमाण पत्र भेजने के लिए कर्ल का उपयोग कर सकता हूं - क्या मैं इस तरह के 'से गुजरने' फ़ाइल को कर्ल के साथ सेवा कर सकता हूं?

धन्यवाद!

उत्तर

5

मैं इस बात से परिचित नहीं हूं कि एस 3 कैसे काम करता है, इसलिए मुझे नहीं पता कि यह समाधान संभव है या नहीं। लेकिन क्या आप बस उपयोगकर्ता के ब्राउज़र को फाइल पर रीडायरेक्ट नहीं कर सके? अगर मैं सही ढंग से समझता हूं, तो एस 3 आपको अपनी बाल्टी में किसी भी फाइल के लिए वेब यूआरएल बनाने की अनुमति देता है। इसलिए, अगर, इन्हें भुगतान का भुगतान किया जाता है, तो आप have S3 generate a temporary URL for that download कर सकते हैं और फिर उपयोगकर्ता को डाउनलोड करने के बाद इसे हटा दें।

अगर वह एक विकल्प नहीं है, तो आप इन पीएचपी वर्ग की कोशिश कर सकते हैं:

  • HTTP protocol client - एक वर्ग जो HTTP संसाधनों के लिए अनुरोध को लागू करता है (नीचे धारा आवरण द्वारा प्रयुक्त)। अनुरोधों को स्ट्रीम करने की अनुमति देता है।
  • gHttp - एक HTTP धारा आवरण आप फ़ाइलों के रूप में दूरदराज HTTP संसाधनों का इलाज fopen(), fread() जैसे कार्यों का उपयोग कर देता है कि, आदि
  • Amazon S3 Stream Wrapper - gHttp रूप में एक ही डेवलपर द्वारा एक अमेज़न S3 धारा आवरण। fopen('s3://...') के माध्यम से दूरस्थ फ़ाइलों को सामान्य फ़ाइलों की तरह एक्सेस करने की अनुमति भी देता है।

संपादित करें:

This page पर जानकारी है कि कैसे "पूर्व प्रमाणित" यूआरएल में प्रमाणीकरण कुंजी एन्कोडिंग द्वारा किए गए अनुरोध के। यह शीर्षक वाले अनुभाग के तहत है: क्वेरी स्ट्रिंग अनुरोध प्रमाणीकरण वैकल्पिक

// I'm only implementing the parts required for GET requests. 
// POST uploads will require additional components. 
function getStringToSign($req, $expires, $uri) { 
    return "$req\n\n\n$expires\n$uri"; 
} 

function encodeSignature($sig, $key) { 
    $sig = utf8_encode($sig); 
    $sig = hash_hmac('sha1', $sig, $key); 
    $sig = base64_encode($sig); 
    return urlencode($sig); 
} 

$expires = strtotime('+1 hour'); 
$stringToSign = getStringToSign('GET', $expires, $uri); 
$signature = encodeSignature($stringToSign, $awsKey); 

$url .= '?AWSAccessKeyId='.$awsKeyId 
     .'&Expires='.$expires 
     .'&Signature='.$signature; 

तो बस $url करने के लिए उपयोगकर्ता अनुप्रेषित, और वे फ़ाइल डाउनलोड करने के लिए सक्षम होना चाहिए। हस्ताक्षर एक तरफा एन्क्रिप्शन योजना (sha1) द्वारा एन्कोड किया गया है, इसलिए आपके एडब्ल्यूएस गुप्त एक्सेस कुंजी का खुलासा होने का कोई खतरा नहीं है।

+0

एक चिंता जो मुझे पुनर्निर्देशन के साथ होगी, यह है कि आपको यह सत्यापित करने की आवश्यकता है कि आपकी सुरक्षा पास नहीं हुई है। अगर पुनर्निर्देशन प्राधिकरण की आवश्यकता है, तो आप इसे ग्राहक को दे रहे हैं। – Joe

+0

ठीक है, यही कारण है कि एक अस्थायी सार्वजनिक यूआरएल उत्पन्न होता है। इस तरह कोई प्रमाणीकरण जानकारी पास नहीं की जाती है, और उपयोगकर्ता को फ़ाइल प्राप्त होने के बाद यूआरएल चला जाता है (या एक निश्चित समय सीमा के बाद)। – Calvin

+0

मुझे नहीं लगता कि यह मेरे नामकरण जोखिम को संबोधित करता है। अगर मैं सीधे डाउनलोड करने की अनुमति देने के लिए दो फाइलों को सार्वजनिक फ़ोल्डर में ले जाता हूं, तो मुझे उन्हें दोस्ताना नाम देना होगा। यह संभव है कि उनके पास एक ही नाम है, और फिर मैं अटक गया हूं। – Corey

1

क्या आपने http_get का उपयोग करने का प्रयास किया है, http_uth और httpauthtype निर्दिष्ट करने के लिए request_options के साथ? हालांकि मुझे याद नहीं है कि यह विधि स्ट्रिंग वैध प्रकार मानती है, जो शायद बाइनरी के लिए काम नहीं कर सकती है।

यदि यह सफल है, तो आपको सही MIME प्रकार प्रदान करने और ब्राउज़र पर लिखने में सक्षम होना चाहिए।

+0

धन्यवाद, जो। मैं इस पर गौर करूंगा। – Corey

0

क्या आपने केवल readfile ("http://username:[email protected]/filename.ext") का उपयोग करके bu की कोशिश की है?

यह केवल आउटपुटबफर को बाईपास और लिख देगा, हालांकि यदि सामग्री-प्रकार चिंता का विषय है तो आपको पहले इसे सत्यापित करने की आवश्यकता है।

रीडफाइल के लिए तर्क के रूप में एन यूआरएल का उपयोग करने के लिए यह भी आवश्यक है कि PHP को urlwrapper-support के साथ संकलित किया गया हो।