เป็นไปได้ไหมที่จะอัปโหลดไฟล์ txt / pdf / png ไปยัง Amazon S3 ในครั้งเดียวและรับ URL ของไฟล์ที่อัปโหลดเป็นการตอบกลับ ถ้าเป็นเช่นนั้น AWS Java SDK คือไลบรารีที่เหมาะสมที่ฉันต้องเพิ่มในเว็บแอปพลิเคชัน java struts2 ของฉัน
โปรดแนะนำวิธีแก้ปัญหานี้ให้ฉัน
เป็นไปได้ไหมที่จะอัปโหลดไฟล์ txt / pdf / png ไปยัง Amazon S3 ในครั้งเดียวและรับ URL ของไฟล์ที่อัปโหลดเป็นการตอบกลับ ถ้าเป็นเช่นนั้น AWS Java SDK คือไลบรารีที่เหมาะสมที่ฉันต้องเพิ่มในเว็บแอปพลิเคชัน java struts2 ของฉัน
โปรดแนะนำวิธีแก้ปัญหานี้ให้ฉัน
คำตอบ:
ในการทำให้ไฟล์เป็นสาธารณะก่อนที่จะอัปโหลดคุณสามารถใช้#withCannedAcl
วิธีPutObjectRequest
:
myAmazonS3Client.putObject(new PutObjectRequest('some-grails-bucket', 'somePath/someKey.jpg', new File('/Users/ben/Desktop/photo.jpg')).withCannedAcl(CannedAccessControlList.PublicRead))
ไม่คุณไม่สามารถรับ URL ในการดำเนินการเดียว แต่เป็นสองรายการ :)
ก่อนอื่นคุณอาจต้องทำให้ไฟล์เป็นสาธารณะก่อนที่จะอัปโหลดเนื่องจากไม่สมเหตุสมผลที่จะได้รับ URL ที่ไม่มีใครสามารถเข้าถึงได้ คุณสามารถทำได้โดยตั้งค่า ACL ตามที่ Michael Astreiko แนะนำ คุณจะได้รับ 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");
Note1:
ความแตกต่างระหว่างgetResourceUrl
และgetUrl
คือ getResourceUrl จะคืนค่า null เมื่อเกิดข้อยกเว้น
หมายเหตุ 2:
getUrl
วิธีการไม่ได้กำหนดไว้ในอินเทอร์เฟซ AmazonS3 คุณต้องส่งวัตถุไปที่ AmazonS3Client หากคุณใช้ตัวสร้างมาตรฐาน
s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")
งานได้กับ URL โดยไม่ต้องเรียก AWS
getResourceUrl
ไม่ได้อยู่ใน sdk ล่าสุด
s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();
จะได้รับ url สาธารณะ
s3Client.utilities().getUrl(getUrlRequest);
คุณสามารถหาที่เก็บข้อมูลและชื่อไฟล์ที่คุณระบุในคำขออัปโหลดได้ด้วยตัวเอง
เช่นหากถังของคุณเป็นmybucket
และไฟล์ของคุณมีชื่อว่าmyfilename
:
https://mybucket.s3.amazonaws.com/myfilename
s3
บิตจะแตกต่างกันขึ้นอยู่กับภูมิภาคถังของคุณอยู่ในตัวอย่างเช่นผมใช้ทางทิศตะวันออกเฉียงใต้ของภูมิภาคเอเชียดังนั้น URL ที่ฉันเป็นเหมือน.
https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename
คำตอบของ @hussachai และ @Jeffrey Kemp นั้นค่อนข้างดี แต่พวกเขามีบางอย่างที่เหมือนกันคือ url ที่ส่งกลับเป็นของ virtual-host-style ไม่ใช่ใน path style สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบ URL s3 ที่สามารถดูรูปแบบ AWS S3 URL ในกรณีที่บางคนต้องการสร้าง url style s3 ของเส้นทาง นี่คือขั้นตอน โดยพื้นฐานแล้วทุกอย่างจะเหมือนกับคำตอบของ @hussachai และ @Jeffrey Kemp เพียงเปลี่ยนการตั้งค่าบรรทัดเดียวดังนี้:
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
ในทำนองเดียวกันหากคุณต้องการเชื่อมโยงผ่าน s3Client คุณสามารถใช้ด้านล่าง
System.out.println("filelink: " + s3Client.getUrl("your_bucket_name", "your_file_key"));
เก่าไปหน่อย แต่สำหรับใครก็ตามที่สะดุดกับสิ่งนี้ในอนาคต:
คุณสามารถทำได้โดยใช้บรรทัดเดียวโดยสมมติว่าคุณได้เขียน CredentialProvider และ AmazonS3Client แล้ว
จะมีลักษณะดังนี้:
String ImageURL = String.valueOf(s3.getUrl(
ConstantsAWS3.BUCKET_NAME, //The S3 Bucket To Upload To
file.getName())); //The key for the uploaded object
และหากคุณไม่ได้เขียน CredentialProvider และ AmazonS3Client ให้เพิ่มก่อนที่จะได้รับ URL ดังนี้:
CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
getApplicationContext(),
"POOL_ID", // Identity pool ID
Regions.US_EAST_1 // Region
);
สำหรับ AWS SDK 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();
System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());
ด้วยวิธีนี้คุณสามารถดึงลิงค์ของไฟล์ที่อัปโหลดไปยังถัง S3 ได้
วิธีการด้านล่างอัปโหลดไฟล์ในโฟลเดอร์เฉพาะในที่เก็บข้อมูลและส่งคืน URL ที่สร้างขึ้นของไฟล์ที่อัปโหลด
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);
}