Amazon S3 carica il file e ottieni l'URL


Risposte:


-35

Per rendere pubblico il file prima del caricamento puoi utilizzare il #withCannedAclmetodo di PutObjectRequest:

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

46
Come ottengo il collegamento da questa richiesta?
Andreas Rudolph

60
Questo non ci dice come ottenere l'URL pubblico della risorsa caricata.
Valentin Waeselynck

107

No, non puoi ottenere l'URL in una sola azione ma due :)

Prima di tutto, potresti dover rendere pubblico il file prima di caricarlo perché non ha senso ottenere l'URL a cui nessuno può accedere. Puoi farlo impostando ACL come suggerito da Michael Astreiko. Puoi ottenere l'URL della risorsa chiamando getResourceUrlo 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");

Nota 1: la differenza tra getResourceUrle getUrlè che getResourceUrl restituirà null quando si verifica un'eccezione.

Nota 2: il getUrl metodo non è definito nell'interfaccia AmazonS3. Devi eseguire il cast dell'oggetto su AmazonS3Client se utilizzi il generatore standard.


27
Vale la pena notare che questo si traduce solo in una singola chiamata ad AWS. Se approfondisci l'SDK Java, vedrai che s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")risolve l'URL senza una chiamata ad AWS.
sihil

3
Questa dovrebbe essere davvero la risposta consigliata. L'altra risposta fallisce nei casi in cui il nome del file include spazi. In tali scenari, il nome del file visualizzato su S3 e il suffisso URL sono diversi l'uno dall'altro. Il metodo s3Client.getUrl di cui sopra gestisce correttamente questo scenario
RvPr

3
Nota, getResourceUrlnon è nell'ultimo sdk.
Martin Serrano

6
per l'ultimo sdk s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();otterrà l'URL pubblico.
kristianva

2
Per le versioni SDK ancora più recenti, provas3Client.utilities().getUrl(getUrlRequest);
mrog

84

Puoi risolverlo da solo dato il bucket e il nome del file che specifichi nella richiesta di caricamento.

ad esempio, se il tuo bucket è mybuckete il tuo file è denominato myfilename:

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

Il s3bit sarà diverso a seconda della regione in cui si trova il bucket. Ad esempio, utilizzo la regione del sud-est asiatico quindi i miei URL sono come:

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

Dopo aver caricato il file dalla console di gestione AWS, i seguenti collegamenti funzionano per un singolo file, quindi quale potrebbe essere la risposta .. s3.amazonaws.com/cdn.generalsentiment.com/MVR/reports/… - cdn.generalsentiment. com.s3.amazonaws.com/MVR/reports/… - cdn.generalsentiment.com/MVR/reports/…
Sangram Anand,

1
Sì, ci sono variazioni all'URL che dovrebbero funzionare. Scegli quello che vuoi usare e fallo.
Jeffrey Kemp,

Kool .. grazie per le informazioni .. A proposito, la parte di caricamento avrà a che fare con la libreria SDK di AWS, giusto?
Sangram Anand,

Sì, credo di sì. Ma non ho esperienza con i montanti.
Jeffrey Kemp

Ho quasi finito con il caricamento della cosa .. ma sono rimasto colpito dalle autorizzazioni. C'è un modo in AWS java sdk per S3 per consentirci di rendere pubblico un file prima del caricamento.
Sangram Anand

6

Le risposte di @hussachai e @Jeffrey Kemp sono piuttosto buone. Ma hanno qualcosa in comune è che l'URL restituito è in stile host virtuale, non in stile percorso. Per ulteriori informazioni sullo stile dell'URL s3, fare riferimento a Stili URL di AWS S3 . Nel caso in cui alcune persone vogliano generare l'URL s3 in stile percorso. Ecco il passaggio. Fondamentalmente tutto sarà uguale alle risposte di @hussachai e @Jeffrey Kemp, solo con una modifica dell'impostazione della riga come di seguito:

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

Questo genererà URL come: https://s3.us-west-2.amazonaws.com/mybucket/myfilename


5

Allo stesso modo se vuoi collegarti tramite s3Client puoi usare di seguito.

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

2

un po 'vecchio ma ancora per chiunque si imbatta in questo in futuro:

puoi farlo con una riga assumendo che tu abbia già scritto CredentialProvider e AmazonS3Client.

sarà simile a questo:

 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 non hai scritto CredentialProvider e AmazonS3Client, aggiungili prima di ottenere l'URL in questo modo:

  CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
        getApplicationContext(),
        "POOL_ID", // Identity pool ID
        Regions.US_EAST_1 // Region
);

1

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

con questo puoi recuperare il link del file già caricato al bucket S3.


0

Il metodo seguente carica il file in una particolare cartella in un bucket e restituisce l'URL generato del file caricato.

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);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.