अमेज़न S3 अपलोड फ़ाइल और URL मिलता है


94

क्या एक कार्रवाई में अमेज़न S3 के लिए एक txt / pdf / png फ़ाइल अपलोड करना संभव है, और प्रतिक्रिया के रूप में अपलोड की गई फ़ाइल URL प्राप्त करें। यदि ऐसा है, तो AWS Java SDK सही लाइब्रेरी है जिसे मुझे अपने जावा स्ट्रट्स 2 वेब एप्लिकेशन में जोड़ना होगा।

कृपया इसके लिए मुझे कोई उपाय सुझाएं।


जवाबों:


-34

अपलोड करने से पहले फ़ाइल को सार्वजनिक करने के लिए आप निम्न #withCannedAclविधि का उपयोग कर सकते हैं PutObjectRequest:

myAmazonS3Client.putObject(new PutObjectRequest('some-grails-bucket',  'somePath/someKey.jpg', new    File('/Users/ben/Desktop/photo.jpg')).withCannedAcl(CannedAccessControlList.PublicRead))

46
मुझे इस अनुरोध से लिंक कैसे मिलेगा?
एंड्रियास रूडोल्फ

60
यह हमें नहीं बताता है कि अपलोड किए गए संसाधन का सार्वजनिक url कैसे प्राप्त करें।
वैलेंटाइन वेस्लेन्क

यह स्वीकृत उत्तर क्यों है?
18

107

नहीं, आपको एक ही क्रिया में URL नहीं मिल सकता है लेकिन दो :)

सबसे पहले, आपको अपलोड करने से पहले फ़ाइल को सार्वजनिक करना पड़ सकता है क्योंकि यह URL प्राप्त करने के लिए कोई मतलब नहीं है जिसे कोई भी एक्सेस नहीं कर सकता है। जैसा कि माइकल एस्ट्रेको ने सुझाव दिया था, एसीएल सेट करके आप ऐसा कर सकते हैं। आप को फोन करके या तो संसाधन URL प्राप्त कर सकते हैं getResourceUrlया getUrl

AmazonS3Client s3Client = (AmazonS3Client)AmazonS3ClientBuilder.defaultClient();
s3Client.putObject(new PutObjectRequest("your-bucket", "some-path/some-key.jpg", new File("somePath/someKey.jpg")).withCannedAcl(CannedAccessControlList.PublicRead))
s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg");

नोट 1 : अलग है getResourceUrlऔर getUrlयह है कि getResourceUrl अपवाद होने पर अशक्त हो जाएगा।

नोट 2: getUrl विधि AmazonS3 इंटरफ़ेस में परिभाषित नहीं है। यदि आप मानक बिल्डर का उपयोग करते हैं तो आपको ऑब्जेक्ट को AmazonS3Client में डालना होगा।


27
यह ध्यान देने योग्य है कि यह केवल AWS के लिए एक कॉल में परिणाम देता है। यदि आप जावा एसडीके में खुदाई करते हैं, तो आप देखेंगे कि s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")एडब्ल्यूएस को कॉल किए बिना यूआरएल को काम करता है।
शिहिल

3
यह वास्तव में अनुशंसित उत्तर होना चाहिए। अन्य जवाब उन मामलों के लिए विफल होता है जहां फ़ाइल-नाम में रिक्त स्थान शामिल हैं। ऐसे परिदृश्यों में, S3 और URL प्रत्यय पर प्रदर्शित फ़ाइल-नाम एक दूसरे से भिन्न होते हैं। उपरोक्त s3Client.getUrl विधि इस परिदृश्य को सही ढंग से संभालती है
RvPr

3
ध्यान दें, getResourceUrlनवीनतम एसडीके में नहीं है।
मार्टिन सेरानो

6
नवीनतम एसडीके के s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();लिए सार्वजनिक यूआरएल मिलेगा।
क्रिश्चियन

2
यहां तक कि नए SDK संस्करणों के लिए, कोशिशs3Client.utilities().getUrl(getUrlRequest);
mrog

84

आप इसे अपने लिए बाल्टी और दिए गए फ़ाइल नाम को अपलोड अनुरोध में बता सकते हैं।

जैसे अगर आपकी बाल्टी है mybucketऔर आपकी फ़ाइल का नाम है myfilename:

https://mybucket.s3.amazonaws.com/myfilename

यह s3अलग होगा कि आपकी बाल्टी किस क्षेत्र के आधार पर अलग-अलग होगी। उदाहरण के लिए, मैं दक्षिण-पूर्व एशिया क्षेत्र का उपयोग करता हूं ताकि मेरे url जैसे हों:

https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename

AWS प्रबंधन कंसोल से फ़ाइल अपलोड करने के बाद, निम्नलिखित लिंक एक फ़ाइल के लिए काम करते हैं, जिससे कोई भी प्रतिक्रिया हो सकती है .. s3.amazonaws.com/cdn.generalsentiment.com/MVR/reports/… - cdn.generalsentiment। com.s3.amazonaws.com/MVR/reports/… - cdn.generalsentiment.com/MVR/reports/…
संग्राम आनंद

1
हां, url में विविधताएं हैं जो काम करनी चाहिए। जिसको आप उपयोग करना चाहते हैं उसे चुनें और उसके साथ जाएं।
जेफरी केम्प

कूल .. जानकारी के लिए धन्यवाद .. जिस तरह से अपलोड करने वाला हिस्सा AWS sdk पुस्तकालय के साथ सही करने जा रहा है?
संग्राम आनंद

हां, मेरा ऐसा मानना ​​है। लेकिन मुझे स्ट्रट्स के साथ कोई अनुभव नहीं है।
जेफरी केम्प

मैं लगभग अपलोड करने वाली चीज़ के साथ किया गया हूँ .. लेकिन अनुमतियों में मारा गया। क्या S3 के लिए AWS जावा sdk में एक तरीका है, अपलोड करने से पहले हमें एक फाइल सार्वजनिक करने दें।
संग्राम आनंद

6

@ हुसचाई और @ जेफ्री केम्प के उत्तर बहुत अच्छे हैं। लेकिन उनके पास कुछ सामान्य है जो लौटाया गया है वह वर्चुअल-होस्ट-स्टाइल का है, पथ शैली में नहीं। S3 url शैली के संबंध में अधिक जानकारी के लिए, AWS S3 URL शैलियाँ देख सकते हैं । कुछ लोगों के मामले में पथ शैली s3 url उत्पन्न करना चाहते हैं। यहाँ कदम है। मूल रूप से सब कुछ @hussachai और @ जेफ्री केम्प के उत्तर के समान होगा, केवल एक पंक्ति सेटिंग नीचे के रूप में बदल जाती है:

AmazonS3Client s3Client = (AmazonS3Client) AmazonS3ClientBuilder.standard()
                    .withRegion("us-west-2")
                    .withCredentials(DefaultAWSCredentialsProviderChain.getInstance())
                    .withPathStyleAccessEnabled(true)
                    .build();

// Upload a file as a new object with ContentType and title specified.
PutObjectRequest request = new PutObjectRequest(bucketName, stringObjKeyName, fileToUpload);
s3Client.putObject(request);
URL s3Url = s3Client.getUrl(bucketName, stringObjKeyName);
logger.info("S3 url is " + s3Url.toExternalForm());

इससे url उत्पन्न होगा: https://s3.us-west-2.amazonaws.com/mybucket/myfilename


5

इसी तरह यदि आप s3Client के माध्यम से लिंक चाहते हैं तो आप नीचे उपयोग कर सकते हैं।

System.out.println("filelink: " + s3Client.getUrl("your_bucket_name", "your_file_key"));

2

थोड़ा पुराना है, लेकिन भविष्य में इस पर ठोकर खाने वाले किसी भी व्यक्ति के लिए:

आप इसे एक पंक्ति के साथ कर सकते हैं, यह मानते हुए कि आपने पहले से ही क्रेडेंशियलप्रोवाइडर और AmazonS3Client लिखा है।

यह इस तरह दिखेगा:

 String ImageURL = String.valueOf(s3.getUrl(
                                  ConstantsAWS3.BUCKET_NAME, //The S3 Bucket To Upload To
                                  file.getName())); //The key for the uploaded object

और अगर आपने क्रेडेंशियलप्रोवाइडर और AmazonS3Client नहीं लिखा है, तो इस तरह से URL प्राप्त करने से पहले उन्हें जोड़ें:

  CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
        getApplicationContext(),
        "POOL_ID", // Identity pool ID
        Regions.US_EAST_1 // Region
);

1

AWS एसडीके 2+ के लिए

String key = "filePath";
String bucketName = "bucketName";
PutObjectResponse response = s3Client
            .putObject(PutObjectRequest.builder().bucket(bucketName ).key(key).build(), RequestBody.fromFile(file));
 GetUrlRequest request = GetUrlRequest.builder().bucket(bucketName ).key(key).build();
 String url = s3Client.utilities().getUrl(request).toExternalForm();

0
        System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());

इसके साथ आप S3 बाल्टी में पहले से अपलोड की गई फ़ाइल का लिंक पुनः प्राप्त कर सकते हैं।


0

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

private String uploadFileToS3Bucket(final String bucketName, final File file) {
    final String uniqueFileName = uploadFolder + "/" + file.getName();
    LOGGER.info("Uploading file with name= " + uniqueFileName);
    final PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, uniqueFileName, file);
    amazonS3.putObject(putObjectRequest);
    return ((AmazonS3Client) amazonS3).getResourceUrl(bucketName, uniqueFileName);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.