ไฟล์อัปโหลด 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.