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
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/…
Санграм Ананд,
1
Да, есть варианты URL, которые должны работать. Выберите тот, который хотите использовать, и используйте его.
Джеффри Кемп,
Kool .. спасибо за информацию .. Кстати, часть загрузки я буду делать с библиотекой AWS sdk, верно?
Санграм Ананд,
Да, я так считаю. Но опыта работы со стойками у меня нет.
Джеффри Кемп,
Я почти закончил с загрузкой ... но столкнулся с разрешениями. Есть ли в AWS java sdk для S3 способ сделать файл общедоступным перед загрузкой?
Санграм Ананд
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);
}
Ankitech
источник