Загрузите файл Amazon S3 и получите URL-адрес

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

Пожалуйста, предложите мне решение для этого.

Ответ 1

Чтобы сделать файл открытым перед загрузкой, вы можете использовать метод #withCannedAcl PutObjectRequest:

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

Ответ 2

Нет, вы не можете получить 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");

Примечание getResourceUrl Различия между getResourceUrl и getUrl том, что getResourceUrl будет возвращать ноль при возникновении исключения.

Примечание 2: метод getUrl не определен в интерфейсе AmazonS3. Вы должны привести объект к AmazonS3Client, если вы используете стандартный компоновщик.

Ответ 3

Вы можете самостоятельно решить эту проблему и указать имя файла, указанное в запросе на загрузку.

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

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

Бит s3 будет отличаться в зависимости от того, в какой области находится ваше ведро. Например, я использую регион юго-восточной Азии, поэтому мои URL-адреса похожи на:

https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename

Ответ 4

Точно так же, если вы хотите ссылку через s3Client, вы можете использовать ниже.

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

Ответ 5

немного устарел, но все еще для тех, кто наткнется на это в будущем:

вы можете сделать это с помощью одной строки, предполагая, что вы уже написали 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
);

Ответ 6

Ответы @hussachai и @Jeffrey Kemp довольно хорошие. Но у них есть что-то общее: возвращаемый URL-адрес выполнен в стиле виртуального хоста, а не в стиле пути. Для получения дополнительной информации о стиле URL-адреса s3 см. Стили URL-адресов AWS S3. В случае, если некоторые люди хотят иметь стиль пути, генерируется s3 url. Здесь шаг. В основном все будет так же, как ответы @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

Ответ 7

        System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());

при этом вы можете получить ссылку на уже загруженный файл в корзину S3.