Amazon S3-Datei hochladen und URL abrufen

92

Ist es möglich, eine txt / pdf / png-Datei in einer einzigen Aktion auf Amazon S3 hochzuladen und die hochgeladene Datei-URL als Antwort zu erhalten? Wenn ja, ist AWS Java SDK die richtige Bibliothek, die ich in meiner Java Struts2-Webanwendung hinzufügen muss.

Bitte schlagen Sie mir eine Lösung dafür vor.

Sangram Anand
quelle

Antworten:

-30

Um die Datei vor dem Hochladen zu veröffentlichen, können Sie folgende #withCannedAclMethoden anwenden PutObjectRequest:

myAmazonS3Client.putObject(new PutObjectRequest('some-grails-bucket',  'somePath/someKey.jpg', new    File('/Users/ben/Desktop/photo.jpg')).withCannedAcl(CannedAccessControlList.PublicRead))
Michael Astreiko
quelle
45
Wie bekomme ich den Link aus dieser Anfrage?
Andreas Rudolph
59
Dies sagt uns nicht, wie wir die öffentliche URL der hochgeladenen Ressource erhalten können.
Valentin Waeselynck
103

Nein, Sie können die URL nicht in einer einzigen Aktion erhalten, sondern in zwei :)

Zunächst müssen Sie die Datei möglicherweise vor dem Hochladen veröffentlichen, da es keinen Sinn macht, die URL abzurufen, auf die niemand zugreifen kann. Sie können dies tun, indem Sie die ACL so einstellen, wie es Michael Astreiko vorgeschlagen hat. Sie können die Ressourcen-URL entweder durch Aufrufen von getResourceUrloder abrufen 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");

Hinweis 1: Der Unterschied zwischen getResourceUrlund getUrlbesteht darin, dass getResourceUrl null ausgibt, wenn eine Ausnahme auftritt.

Hinweis 2: Die getUrl Methode ist in der AmazonS3-Schnittstelle nicht definiert. Sie müssen das Objekt in AmazonS3Client umwandeln, wenn Sie den Standard-Builder verwenden.

Hussachai
quelle
24
Es ist erwähnenswert, dass dies nur zu einem einzigen Aufruf von AWS führt. Wenn Sie sich in das Java SDK vertiefen, werden Sie feststellen, dass s3Client.getResourceUrl("your-bucket", "some-path/some-key.jpg")die URL ohne einen Aufruf von AWS funktioniert.
Sihil
3
Dies sollte wirklich die empfohlene Antwort sein. Die andere Antwort schlägt in Fällen fehl, in denen der Dateiname Leerzeichen enthält. In solchen Szenarien unterscheiden sich der in S3 angezeigte Dateiname und das URL-Suffix voneinander. Die obige s3Client.getUrl-Methode behandelt dieses Szenario korrekt
RvPr
3
Beachten Sie, getResourceUrlist nicht in der neuesten SDK.
Martin Serrano
1
Es ist immernoch da. Möglicherweise müssen Sie die Schnittstelle (AmazonS3) in die Klasse (AmazonS3Client) umwandeln.
Hussachai
6
Für die neuesten SDK s3Client.getUrl("your-bucket", "some-path/some-key.jpg").toString();wird die öffentliche URL erhalten.
Kristianva
82

Sie können es anhand des Buckets und des Dateinamens, den Sie in der Upload-Anfrage angegeben haben, selbst herausfinden.

zB wenn Ihr Bucket ist mybucketund Ihre Datei benannt ist myfilename:

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

Das s3Bit hängt davon ab, in welcher Region sich Ihr Bucket befindet. Zum Beispiel verwende ich die Region Südostasien, sodass meine URLs wie folgt lauten:

https://mybucket.s3-ap-southeast-1.amazonaws.com/myfilename
Jeffrey Kemp
quelle
Nach dem Hochladen der Datei von der AWS-Verwaltungskonsole funktionieren die folgenden Links für eine einzelne Datei. Dies könnte also die Antwort sein. S3.amazonaws.com/cdn.generalsentiment.com/MVR/reports/… - cdn.generalsentiment. com.s3.amazonaws.com/MVR/reports/… - cdn.generalsentiment.com/MVR/reports/…
Sangram Anand
1
Ja, es gibt Variationen der URL, die funktionieren sollten. Wählen Sie die aus, die Sie verwenden möchten, und gehen Sie damit um.
Jeffrey Kemp
Kool .. danke für die Info .. Übrigens wird der Upload-Teil mit der AWS SDK-Bibliothek zu tun haben, oder?
Sangram Anand
Ja, ich glaube schon. Aber ich habe keine Erfahrung mit Streben.
Jeffrey Kemp
Ich bin fast fertig mit dem Hochladen .. aber beeindruckt von den Berechtigungen. Gibt es im AWS Java SDK für S3 eine Möglichkeit, eine Datei vor dem Hochladen zu veröffentlichen?
Sangram Anand
6

Die Antworten von @hussachai und @Jeffrey Kemp sind ziemlich gut. Sie haben jedoch etwas gemeinsam: Die zurückgegebene URL ist im Stil eines virtuellen Hosts und nicht im Pfadstil. Weitere Informationen zum s3-URL-Stil finden Sie unter AWS S3-URL-Stile . Im Falle einiger Leute möchten Pfad Stil s3 URL generiert werden. Hier ist der Schritt. Grundsätzlich entspricht alles den Antworten von @hussachai und @Jeffrey Kemp, nur mit einer Änderung der Zeileneinstellung wie folgt:

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

Dies generiert eine URL wie: https://s3.us-west-2.amazonaws.com/mybucket/myfilename

James
quelle
5

Wenn Sie eine Verknüpfung über s3Client wünschen, können Sie diese ebenfalls verwenden.

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

ein bisschen alt, aber immer noch für alle, die in Zukunft darauf stoßen:

Sie können dies mit einer Zeile tun, vorausgesetzt, Sie haben bereits den CredentialProvider und den AmazonS3Client geschrieben.

es wird so aussehen:

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

und wenn Sie den CredentialProvider und den AmazonS3Client nicht geschrieben haben, fügen Sie sie einfach hinzu, bevor Sie die URL wie folgt erhalten:

  CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
        getApplicationContext(),
        "POOL_ID", // Identity pool ID
        Regions.US_EAST_1 // Region
);
Überrollkäfig
quelle
0
        System.out.println("Link : " + s3Object.getObjectContent().getHttpRequest().getURI());

Damit können Sie den Link der bereits hochgeladenen Datei zum S3-Bucket abrufen.

Omkar Ayachit
quelle