2015-11-19 11 views
12

Iam लौट Boto3 का उपयोग कर S3 और कहा कि अपलोड की गई फ़ाइल को सार्वजनिक करने और एक यूआरएल के रूप में यह वापस जाने के लिए फ़ाइलों को अपलोड करने की कोशिश कर रहा।अपलोड Boto3 का उपयोग करने और सार्वजनिक url

class UtilResource(BaseZMPResource): 
class Meta(BaseZMPResource.Meta): 
    queryset = Configuration.objects.none() 
    resource_name = 'util_resource' 
    allowed_methods = ['get'] 

def post_list(self, request, **kwargs): 

    fileToUpload = request.FILES 
    # write code to upload to amazone s3 
    # see: https://boto3.readthedocs.org/en/latest/reference/services/s3.html 


    self.session = Session(aws_access_key_id=settings.AWS_KEY_ID, 
        aws_secret_access_key=settings.AWS_ACCESS_KEY, 
        region_name=settings.AWS_REGION) 

    client = self.session.client('s3') 
    client.upload_file('zango-static','fileToUpload') 


    url = "some/test/url" 
    return self.create_response(request, { 
     'url': url // return's public url of uploaded file 
    }) 

मैं पूरी प्रलेखन की खोज मैं किसी भी लिंक जो बताती है कि यह किसी को समझाने या किसी संसाधन जहाँ मैं soultion पा सकते हैं प्रदान कर सकते हैं करने के लिए नहीं मिल सकता है?

+0

कहाँ सक्षम इस काम करने के लिए प्राप्त करने के लिए? – nadermx

+0

@nadermx मैं इस काम को पाने में सक्षम नहीं था क्या आप मेरी मदद कर सकते हैं? –

उत्तर

18

मैं एक ही स्थिति में हूं। जेनर_presigned_url से परे Boto3 दस्तावेज़ों में कुछ भी नहीं ढूंढ पा रहा है, जो मुझे मेरे मामले में आवश्यक नहीं है क्योंकि मेरे पास सार्वजनिक पठनीय एस 3 ऑब्जेक्ट्स हैं।

सबसे अच्छा मैं के साथ आया है:

bucket_location = boto3.client('s3').get_bucket_location(Bucket=s3_bucket_name) 
object_url = "https://s3-{0}.amazonaws.com/{1}/{2}".format(
    bucket_location['LocationConstraint'], 
    s3_bucket_name, 
    key_name) 

आप एक बेहतर समाधान के लिए boto3 github issues list पर पोस्ट करने का प्रयास हो सकता है।

7

मुझे एक ही समस्या थी। मान लिया जाये कि आप बाल्टी नाम है जहाँ आप अपने डेटा स्टोर करना चाहते हैं पता है, तुम कर सकते हैं तो का उपयोग करें:

import boto3 
from boto3.s3.transfer import S3Transfer 

credentials = { 
    'aws_access_key_id': aws_access_key_id, 
    'aws_secret_access_key': aws_secret_access_key 
} 

client = boto3.client('s3', 'us-west-2', **credentials) 
transfer = S3Transfer(client) 

transfer.upload_file('/tmp/myfile', bucket, key, 
        extra_args={'ACL': 'public-read'}) 

file_url = '%s/%s/%s' % (client.meta.endpoint_url, bucket, key) 
+1

क्या आप कृपया अपना कोड थोड़ा और समझा सकते हैं। – Whitecat

+0

धन्यवाद, S3Transfer का उपयोग करके upload_file में extra_args मुझे कस्टम एंडपॉइंट्स के लिए सत्र के माध्यम से क्लाइंट बनाने के दौरान संयोजन के रूप में उपयोग करने की आवश्यकता होती है। – madprops

1

सबसे अच्छा समाधान मैंने पाया अभी भी generate_presigned_url, Client.Config.signature_version आवश्यकताओं के सेट होने के लिए सिर्फ इतना है कि उपयोग करने के लिए है botocore.UNSIGNED

निम्नलिखित हस्ताक्षर सामग्री के बिना सार्वजनिक लिंक देता है।

config.signature_version = botocore.UNSIGNED 
boto3.client('s3', config=config).generate_presigned_url('get_object', ExpiresIn=0, Params={'Bucket': bucket, 'Key': key}) 

boto3 भंडार पर प्रासंगिक विचार-विमर्श कर रहे हैं:

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