2016-02-02 8 views
6

मैं एक परियोजना पर काम कर रहा हूं जिसमें एस 3 यूआरएल उत्पन्न करना शामिल है जो कोई और मेरी एस 3 बाल्टी में फाइल अपलोड करने के लिए उपयोग कर सकता है। यहाँ एक न्यूनतम काम कर उदाहरण है:,एडब्ल्यूएस PHP एसडीके: निर्धारित एसआरएल फ़ाइल सेट आकार निर्धारित यूआरएल

<?php 

    require('aws.phar'); 
    use Aws\S3\S3Client; 

    $s3client = new S3Client(...); // credentials go here 

    $id = uniqid(); // generate some kind of key 

    $command = $s3client->getCommand('PutObject', [ 
     'ACL' => 'private', 
     'Body' => '', 
     'Bucket' => 'mybucket', 
     'Key' => 'tmp/' . $id]); 

    echo (string) $s3client->createPresignedRequest($command, '+5 minutes')->getURI(); 

?> 

अब अगर मैं एक स्थान इंटरनेट द्वारा पहुँचा जा सकता पर उस फ़ाइल के शब्दों में कहें, मेरे वेब सर्वर नया हस्ताक्षर किए अपलोड यूआरएल लाने के लिए इस्तेमाल किया जा सकता:

$ curl http://my.domain.com/some/page.php 
https://s3.amazonaws.com/mybucket/tmp/someID?x-amz-acl=private&lots-of-aws-params... 
$ curl -X PUT -d "@someFile" https://s3.amazonaws.com/mybucket/tmp/someID?x-amz-acl=private&lots-of-aws-params... 
$ 

यह सफलतापूर्वक मेरी बाल्टी में एक स्थानीय फाइल अपलोड करता है, इसलिए मैं एस 3 में इसके साथ खेल सकता हूं।

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

<?php 

    require('aws.phar'); 
    use Aws\S3\S3Client; 

    $s3client = new S3Client(...); // credentials go here 

    $id = uniqid(); // generate some kind of key 

    $policy = [ 
     'conditions' => [ 
      ['acl' => 'private'], 
      ['bucket' => 'mybucket'], 
      ['content-length-range', 0, 8*1024], // 8 KiB 
      ['starts-with', '$key', 'tmp/'] 
     ], 'expiration' => 
      (new DateTime())->modify('+5 minutes')->format(DateTime::ATOM)]; 

    $command = $s3client->getCommand('PutObject', [ 
     'ACL' => 'private', 
     'Body' => '', 
     'Bucket' => 'mybucket', 
     'Key' => 'tmp/' . $id, 
     'Policy' => $policy]); 

    echo (string) $s3client->createPresignedRequest($command, '+5 minutes')->getURI(); 

?> 

इस संस्करण है कि एक ही तरह से इस्तेमाल किया जा सकता है (त्रुटियों के कोई संकेत के बिना) उत्पन्न करता है यूआरएल। मुझे यकीन नहीं है कि मुझे नीति में उन शर्तों में से कुछ की आवश्यकता है (acl, bucket, starts-with), लेकिन मुझे नहीं लगता कि उनमें शामिल पॉलिसी तोड़ जाएगी।

सिद्धांत रूप में, 8 साइनबी से बड़ी फ़ाइल अपलोड करने के लिए इस हस्ताक्षरित यूआरएल का उपयोग करने का प्रयास एस 3 को अपलोड को रद्द करने का कारण बनना चाहिए। हालांकि, एक बड़ी फ़ाइल के साथ इस परीक्षण से पता चलता है कि curl अभी भी खुशी से फ़ाइल अपलोड करता है:

$ ls -lh file.txt 
-rw-rw-r-- 1 millinon millinon 210K Jan 2 00:41 file.txt 
$ curl http://my.domain.com/some/page.php 
https://s3.amazonaws.com/mybucket/tmp/someOtherID?x-amz-acl=private&lots-of-aws-params... 
$ curl -X PUT -d "@file.txt" https://s3.amazonaws.com/mybucket/tmp/someOtherID?x-amz-acl=private&lots-of-aws-params... 
$ 

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

'Policy' => json_encode($policy) 
'Policy' => base64_encode(json_encode($policy)) 

हालांकि, यूआरएल उत्पन्न इन संस्करणों में से किसी निर्दिष्ट आकार अपलोड करने की तुलना में बड़ा फ़ाइलों की अनुमति के साथ:

के बाद से विभिन्न पृष्ठों नीति संलग्न करने के विभिन्न तरीके दिखाने के लिए, मैं भी निम्न संस्करणों की कोशिश की है।

क्या मैं गलत तरीके से पॉलिसी संलग्न कर रहा हूं, या इस तरह से एस 3 पर अपलोड को सीमित करने के लिए एक मौलिक सीमा है?

मेरे वेब सर्वर के लिए, मैं PHP के लिए एडब्ल्यूएस एसडीके के संस्करण 3.14.1 के साथ एचएचवीएम 3.11.1 का उपयोग कर रहा हूं।

उत्तर

3

एक एस 3 अपलोड नीति का उपयोग पूर्व-हस्ताक्षरित यूआरएल के साथ नहीं किया जा सकता है।

नीति नीति का उपयोग browser uploads to S3 using HTML POST Forms के साथ किया जा सकता है।

पूर्व हस्ताक्षर किए यूआरएल और एचटीएमएल पोस्ट रूपों S3 पर अपलोड करने के दो अलग अलग तरीके हैं। पूर्व तर्कसंगत रूप से सरल है, लेकिन बाद के मुकाबले कम लचीला है।

अद्यतन

आप एक ब्राउज़र के उपयोग के बिना फ़ाइलों को अपलोड करना आवश्यक है, एचटीएमएल पोस्ट फार्म के अनुरोध PHP के curl काम करता है, एक पुस्तकालय में इस तरह का उपयोग कर Guzzle के रूप में, या के रूप में इस कमांड लाइन का उपयोग कर reproduced किया जा सकता है :

curl 'https://s3-bucket.s3.amazonaws.com/' \ 
    -F 'key=uploads/${filename}' \ 
    -F 'AWSAccessKeyId=YOUR_AWS_ACCESS_KEY' \ 
    -F 'acl=private' \ 
    -F 'success_action_redirect=http://localhost/' \ 
    -F 'policy=YOUR_POLICY_DOCUMENT_BASE64_ENCODED' \ 
    -F 'signature=YOUR_CALCULATED_SIGNATURE' \ 
    -F 'Content-Type=image/jpeg' \ 
    -F '[email protected]' 
+0

मुझे पता है कि एचटीएमएल पोस्ट रूपों एक विकल्प हैं, लेकिन मैं विशेष रूप से नहीं लक्षित कर रहा हूँ ब्राउज़र का उपयोग। सलाह के लिये धन्यवाद! – millinon

+0

पोस्ट फ़ील्ड जो कुछ भी मैं जा रहा हूं उससे थोड़ा अधिक जटिल है - मैं वास्तव में केवल एक ही यूआरएल उत्पन्न करना चाहता हूं जिसे HTTP PUT का समर्थन करने वाले किसी भी क्लाइंट में कॉपी/पेस्ट किया जा सकता है। मुझे इस समाधान को बहुत पसंद है हालांकि - HTTP PUT का समर्थन करने वाले क्लाइंट शायद पोस्ट फ़ील्ड का समर्थन करने जा रहे हैं, इसलिए मैं इसे अपलोड करने के तरीके के रूप में प्रदान करने का प्रयास करूंगा। – millinon

2

आप अपने बाल्टी के लिए विशिष्ट नीति को जोड़ने का प्रयास कर सकते हैं

$s3client->putBucketPolicy(array(
    'Bucket' => $bucket, 
    'Policy' => json_encode(array(
     'conditions' => array(
      array(
       'content-length-range', 0, 8*1024, 
       'starts-with', '$key', 'tmp/' 
       ... 
,210

और इस के बाद, बस इतना है कि मेरे मामले में एक समाधान नहीं है, सामान्य putObject आदेश

$command = $s3client->getCommand('PutObject', [ 
    'ACL' => 'private', 
    'Body' => '', 
    'Bucket' => 'mybucket', 
    'Key' => 'tmp/' . $id]); 
+0

मुझे लगता है कि यह सही दिशा है - मुझे नीति को बाल्टी में संलग्न करने की ज़रूरत है, न कि PutObject अनुरोध स्वयं। हालांकि, ऐसा लगता है कि 'सामग्री-लंबाई-श्रेणी' केवल ब्राउज़र अपलोड नीति स्थिति के रूप में समर्थित है, इसलिए मुझे यकीन नहीं है कि एक निर्धारित यूआरएल में फ़ाइल आकार प्रतिबंध या बाल्टी की विशेषता के रूप में शामिल करना संभव है। – millinon

+0

क्या कोई यह पुष्टि कर सकता है कि यह काम करता है या नहीं? – CamHart

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