2012-05-22 10 views
6

का उपयोग कर एडब्ल्यूएस एस 3 बाल्टी में बाहरी फ़ाइल अपलोड करें मैं PHP एसडीके का उपयोग कर सीधे एक अमेज़ॅन एस 3 बाल्टी पर एक बाहरी यूआरएल से एक फाइल अपलोड करना चाहता हूं।PHP एसडीके

$s3 = new AmazonS3(); 
$response = $s3->create_object($bucket, $destination, array(
    'fileUpload' => $source, 
    'length' => remote_filesize($source), 
    'contentType' => 'image/jpeg' 
)); 

कहाँ समारोह remote_filesize निम्नलिखित है:: मैं निम्नलिखित कोड के साथ ऐसा करने में कामयाब रहे

function remote_filesize($url) { 
    ob_start(); 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLOPT_NOBODY, 1); 
    $ok = curl_exec($ch); 
    curl_close($ch); 
    $head = ob_get_contents(); 
    ob_end_clean(); 
    $regex = '/Content-Length:\s([0-9].+?)\s/'; 
    $count = preg_match($regex, $head, $matches); 
    return isset($matches[1]) ? $matches[1] : "unknown"; 
} 

हालांकि, यह अच्छा होगा अगर मैं कब से अमेज़न पर अपलोड फ़ाइल आकार की स्थापना को छोड़ सकता है यह मुझे अपने सर्वर पर एक यात्रा बचाएगा। लेकिन अगर मैं $ s3-> create_object फ़ंक्शन में 'लंबाई' प्रॉपर्टी को सेट करना हटा देता हूं, तो मुझे यह कहते हुए एक त्रुटि मिलती है कि 'स्ट्रीमिंग अपलोड के लिए स्ट्रीम आकार निर्धारित नहीं किया जा सकता है।' इस समस्या को हल करने के लिए कोई विचार?

उत्तर

0

क्या आपके पास रिमोट सर्वर/होस्ट पर कोई नियंत्रण है? यदि ऐसा है तो आप स्थानीय रूप से फ़ाइल से पूछताछ करने के लिए एक PHP सर्वर स्थापित कर सकते हैं और डेटा को पास कर सकते हैं।

यदि नहीं, तो आप हेडर का निरीक्षण करने के लिए कर्ल की तरह कुछ उपयोग कर सकते हैं;

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://sstatic.net/so/img/logo.png'); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_exec($ch); 
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); 
var_dump($size); 

इस तरह, आप एक HEAD अनुरोध का उपयोग कर रहे हैं, और पूरी फ़ाइल नहीं डाउनलोड करने - अभी भी, आप दूरस्थ सर्वर पर निर्भर करती है एक सही सामग्री-लंबाई हेडर भेजें।

+0

मेरे पास रिमोट सर्वर/होस्ट पर कोई नियंत्रण नहीं है। मैंने पहले ही सुझाई गई विधि का प्रयास किया है, लेकिन भले ही यह हेडर का अनुरोध करता है, फिर भी यह प्रक्रिया को धीमा कर देता है। मैंने अपने सर्वर को अमेज़ॅन में भी स्थानांतरित करने का निर्णय लिया (उसी उपलब्धता क्षेत्र में बाल्टी के रूप में), और अब यह गति तक है। – Bjorn

2

आप सीधे इस तरह अमेज़न S3 के लिए यूआरएल से फाइल अपलोड कर सकते हैं (मेरे उदाहरण एक जेपीजी तस्वीर के बारे में है):

1. द्विआधारी

$binary = file_get_contents('http://the_url_of_my_image.....'); 

2 में यूआरएल से सामग्री कन्वर्ट । एक शरीर के साथ एक S3 वस्तु बनाएं

$s3 = new AmazonS3(); 
$response = $s3->create_object($bucket, $filename, array(
    'body' => $binary, // put the binary in the body 
    'contentType' => 'image/jpeg' 
)); 
में द्विआधारी पारित करने के लिए

यह सब कुछ है और यह बहुत तेज़ है। का आनंद लें!

+3

file_get_contents के साथ आप पहले फ़ाइल की सामग्री को अपने सर्वर पर ले जा रहे हैं, और फिर S3 पर, इस प्रकार अतिरिक्त ट्रैफ़िक – Bjorn

+1

को समाप्त नहीं करते हैं, आप सही हैं। एस 3 (अतिरिक्त यातायात और अतिरिक्त समय) भेजने से पहले सर्वर डेटा पढ़ता है। मैंने सोचा कि आपको यूआरएल से डेटा पढ़ने में परेशानी है। क्या आपको सीधे S3 पर सामग्री भेजने का समाधान मिला? धन्यवाद –

+0

दुर्भाग्य से – Bjorn

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