Завантажте файл Amazon S3 та отримайте URL-адресу


94

Чи можна одним завантаженням завантажити файл txt / pdf / png на Amazon S3 і отримати у відповідь URL-адресу завантаженого файлу. Якщо так, то чи є AWS Java SDK правильною бібліотекою, яку мені потрібно додати у веб-програмі java struts2.

Будь ласка, підкажіть мені рішення для цього.


Відповіді:


-35

Щоб зробити файл загальнодоступним перед завантаженням, ви можете використовувати #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-адресу завантаженого ресурсу.
Valentin Waeselynck

Чому це прийнята відповідь?
lanxion

107

Ні, ви не можете отримати URL-адресу однією дією, але двома :)

Перш за все, можливо, вам доведеться зробити файл загальнодоступним перед завантаженням, оскільки немає сенсу отримувати URL-адресу, до якої ніхто не може отримати доступ. Ви можете зробити це, встановивши ACL, як запропонував Майкл Астрейко. Ви можете отримати 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 повертає значення 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.
Мартін Серрано,

6
для останнього sdk s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();отримає загальнодоступну URL-адресу.
kristianva

2
Для ще новіших версій SDK спробуйтеs3Client.utilities().getUrl(getUrlRequest);
mrog

84

Ви можете це зробити самостійно, враховуючи сегмент та ім’я файлу, яке ви вказали в запиті на завантаження.

наприклад, якщо ваш сегмент mybucketі ваш файл іменований myfilename:

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

s3Трохи буде відрізнятися в залежності від того, якого регіону вашого відра в Наприклад, я використовую Регион Юго-восток , так що мої URLs схожі .:

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 / ...
Sangram Anand

1
Так, існують варіанти URL-адреси, які повинні працювати. Виберіть той, який ви хочете використовувати, і йдіть з ним.
Джеффрі Кемп,

Kool .. дякую за інформацію .. До речі, завантажувальна частина я буду робити з бібліотекою SDK AWS, так?
Sangram Anand

Так, я так вважаю. Але я не маю досвіду роботи з розпірками.
Джеффрі Кемп,

Я майже закінчив з завантаженням речі, але з побоюванням на дозволи. Чи є спосіб у AWS java sdk для S3 дозволити нам зробити файл загальнодоступним перед завантаженням.
Sangram Anand

6

Відповіді @hussachai та @Jeffrey Kemp досить добрі. Але у них є щось спільне - повернута URL-адреса має стиль віртуального хосту, а не стиль стилю. Для отримання додаткової інформації щодо стилю URL-адреси s3, зверніться до стилів URL-адрес AWS S3 . Якщо деякі люди хочуть створити URL-адресу стилю шляху 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
        System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());

за допомогою цього ви можете отримати посилання на вже завантажений файл у сегмент S3.


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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.