ไฟล์อัปโหลด Amazon S3 และรับ URL


94

เป็นไปได้ไหมที่จะอัปโหลดไฟล์ txt / pdf / png ไปยัง Amazon S3 ในครั้งเดียวและรับ URL ของไฟล์ที่อัปโหลดเป็นการตอบกลับ ถ้าเป็นเช่นนั้น AWS Java SDK คือไลบรารีที่เหมาะสมที่ฉันต้องเพิ่มในเว็บแอปพลิเคชัน java struts2 ของฉัน

โปรดแนะนำวิธีแก้ปัญหานี้ให้ฉัน


คำตอบ:


-36

ในการทำให้ไฟล์เป็นสาธารณะก่อนที่จะอัปโหลดคุณสามารถใช้#withCannedAclวิธีPutObjectRequest:

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

46
ฉันจะนำลิงก์ออกจากคำขอนี้ได้อย่างไร
Andreas Rudolph

60
สิ่งนี้ไม่ได้บอกเราถึงวิธีรับ url สาธารณะของทรัพยากรที่อัปโหลด
Valentin Waeselynck

107

ไม่คุณไม่สามารถรับ URL ในการดำเนินการเดียว แต่เป็นสองรายการ :)

ก่อนอื่นคุณอาจต้องทำให้ไฟล์เป็นสาธารณะก่อนที่จะอัปโหลดเนื่องจากไม่สมเหตุสมผลที่จะได้รับ URL ที่ไม่มีใครสามารถเข้าถึงได้ คุณสามารถทำได้โดยตั้งค่า ACL ตามที่ Michael Astreiko แนะนำ คุณจะได้รับ URL ทรัพยากรอย่างใดอย่างหนึ่งโดยการเรียกหรือgetResourceUrlgetUrl

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 หากคุณใช้ตัวสร้างมาตรฐาน


27
เป็นที่น่าสังเกตว่าสิ่งนี้ส่งผลให้เกิดการเรียกใช้ AWS เพียงครั้งเดียว หากคุณเจาะลึกลงไปใน Java SDK คุณจะเห็นว่าใช้s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")งานได้กับ URL โดยไม่ต้องเรียก AWS
sihil

3
นี่ควรเป็นคำตอบที่แนะนำจริงๆ คำตอบอื่นล้มเหลวสำหรับกรณีที่ชื่อไฟล์มีช่องว่าง ในสถานการณ์เช่นนี้ชื่อไฟล์ที่แสดงบน S3 และส่วนต่อท้าย URL จะแตกต่างจากชื่ออื่น วิธี s3Client.getUrl ข้างต้นจัดการสถานการณ์นี้อย่างถูกต้อง
RvPr

3
หมายเหตุgetResourceUrlไม่ได้อยู่ใน sdk ล่าสุด
Martin Serrano

6
สำหรับ sdk ล่าสุดs3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();จะได้รับ url สาธารณะ
คริสเตียนวา

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 รูปแบบต่างๆที่ควรใช้งานได้ เลือกสิ่งที่คุณต้องการใช้และไปด้วย
Jeffrey Kemp

Kool .. ขอบคุณสำหรับข้อมูล .. ส่วนการอัปโหลดจะทำกับ AWS sdk library ใช่ไหม
Sangram Anand

ใช่ฉันเชื่ออย่างนั้น แต่ฉันไม่มีประสบการณ์กับเสา
Jeffrey Kemp

ฉันเกือบเสร็จแล้วกับสิ่งที่อัปโหลด .. แต่พลาดที่สิทธิ์ มีวิธีใน AWS java sdk สำหรับ S3 หรือไม่ที่จะให้เราทำให้ไฟล์เป็นสาธารณะก่อนที่จะอัปโหลด
Sangram Anand

6

คำตอบของ @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


5

ในทำนองเดียวกันหากคุณต้องการเชื่อมโยงผ่าน s3Client คุณสามารถใช้ด้านล่าง

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

2

เก่าไปหน่อย แต่สำหรับใครก็ตามที่สะดุดกับสิ่งนี้ในอนาคต:

คุณสามารถทำได้โดยใช้บรรทัดเดียวโดยสมมติว่าคุณได้เขียน 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
);

1

สำหรับ 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();


0

วิธีการด้านล่างอัปโหลดไฟล์ในโฟลเดอร์เฉพาะในที่เก็บข้อมูลและส่งคืน 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);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.