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