Amazon S3 carregue o arquivo e obtenha URL

93

É possível fazer upload de um arquivo txt / pdf / png para o Amazon S3 em uma única ação e obter o URL do arquivo enviado como a resposta. Em caso afirmativo, o AWS Java SDK é a biblioteca certa que preciso adicionar ao meu aplicativo da web java struts2.

Por favor, me sugira uma solução para isso.

Sangram Anand
fonte

Respostas:

-31

Para tornar o arquivo público antes de enviar, você pode usar o #withCannedAclmétodo de PutObjectRequest:

myAmazonS3Client.putObject(new PutObjectRequest('some-grails-bucket',  'somePath/someKey.jpg', new    File('/Users/ben/Desktop/photo.jpg')).withCannedAcl(CannedAccessControlList.PublicRead))
Michael Astreiko
fonte
45
Como faço para obter o link desta solicitação?
Andreas Rudolph
59
Isso não nos diz como obter o url público do recurso enviado.
Valentin Waeselynck
105

Não, você não pode obter o URL em uma única ação, mas duas :)

Em primeiro lugar, pode ser necessário tornar o arquivo público antes de enviar, porque não faz sentido obter o URL que ninguém pode acessar. Você pode fazer isso configurando ACL como Michael Astreiko sugeriu. Você pode obter o URL do recurso chamando getResourceUrlou 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");

Nota1: A diferença entre getResourceUrle getUrlé que getResourceUrl retornará nulo quando ocorrer uma exceção.

Nota2: o getUrl método não está definido na interface AmazonS3. Você precisa lançar o objeto para AmazonS3Client se usar o construtor padrão.

Hussachai
fonte
25
É importante notar que isso resulta apenas em uma única chamada para a AWS. Se você se aprofundar no Java SDK, verá que s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")funciona o URL sem uma chamada para a AWS.
sihil
3
Essa realmente deveria ser a resposta recomendada. A outra resposta falha para casos em que o nome do arquivo inclui espaços. Em tais cenários, o nome do arquivo exibido no S3 e o sufixo da URL são diferentes um do outro. O método s3Client.getUrl acima lida com este cenário corretamente
RvPr
3
Nota, getResourceUrlnão está no SDK mais recente.
Martin Serrano
1
Ainda está lá. Você pode ter que lançar a interface (AmazonS3) para a classe (AmazonS3Client).
hussachai
6
para o SDK mais recente s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();obterá o url público.
kristianva
82

Você pode resolver isso sozinho com base no intervalo e no nome do arquivo que especificar na solicitação de upload.

por exemplo, se o seu intervalo for mybuckete o seu arquivo for nomeado myfilename:

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

O s3bit será diferente dependendo da região em que seu intervalo está. Por exemplo, eu uso a região sudeste da Ásia para que meus urls sejam como:

https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename
Jeffrey Kemp
fonte
Depois de fazer o upload do arquivo do console de gerenciamento da AWS, os links a seguir funcionam para um único arquivo, então qual deles pode ser a resposta .. s3.amazonaws.com/cdn.generalsentiment.com/MVR/reports/… - cdn.generalsentiment. com.s3.amazonaws.com/MVR/reports/… - cdn.generalsentiment.com/MVR/reports/…
Sangram Anand
1
Sim, existem variações no url que devem funcionar. Escolha aquele que deseja usar e vá em frente.
Jeffrey Kemp
Kool .. obrigado pela informação .. A propósito, a parte de upload farei com a biblioteca SDK da AWS, certo?
Sangram Anand
Sim, eu acredito que sim. Mas não tenho experiência com struts.
Jeffrey Kemp
Estou quase terminando o upload ... mas não consegui as permissões. Existe uma maneira no AWS java sdk para S3 nos permitir tornar um arquivo público antes de fazer o upload.
Sangram Anand
6

As respostas de @hussachai e @Jeffrey Kemp são muito boas. Mas eles têm algo em comum: o url retornado é no estilo de host virtual, não no estilo de caminho. Para obter mais informações sobre o estilo de URL s3, consulte AWS S3 URL Styles . No caso de algumas pessoas quererem que o URL s3 do estilo do caminho seja gerado. Aqui está o passo. Basicamente, tudo será igual às respostas de @hussachai e @Jeffrey Kemp, apenas com a alteração de configuração de uma linha conforme abaixo:

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());

Isso irá gerar url como: https://s3.us-west-2.amazonaws.com/mybucket/myfilename

James
fonte
5

Da mesma forma, se você quiser um link por meio do s3Client, poderá usar a seguir.

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

um pouco velho, mas ainda para qualquer um que tropece nisso no futuro:

você pode fazer isso com uma linha, supondo que já escreveu o CredentialProvider e o AmazonS3Client.

Isso parecerá assim:

 String ImageURL = String.valueOf(s3.getUrl(
                                  ConstantsAWS3.BUCKET_NAME, //The S3 Bucket To Upload To
                                  file.getName())); //The key for the uploaded object

e se você não escreveu o CredentialProvider e o AmazonS3Client, basta adicioná-los antes de obter o URL como este:

  CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
        getApplicationContext(),
        "POOL_ID", // Identity pool ID
        Regions.US_EAST_1 // Region
);
gaiola de protecção
fonte
0
        System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());

com isso, você pode recuperar o link do arquivo já carregado para o balde S3.

Omkar Ayachit
fonte
0

O método abaixo carrega o arquivo em uma pasta específica em um intervalo e retorna a url gerada do arquivo carregado.

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
fonte