it-swarm.com.de

Amazon S3-Upload-Datei und URL abrufen

Ist es möglich, eine txt/pdf/png-Datei in einer einzigen Aktion zu Amazon S3 hochzuladen und die hochgeladene Datei-URL als Antwort zu erhalten. Ist dies der Fall, ist AWS Java sdk die richtige Bibliothek, die ich in meine Java struts2-Webapplikation einfügen muss.

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

75
Sangram Anand

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

Zunächst müssen Sie die Datei möglicherweise vor dem Hochladen öffentlich machen, da es keinen Sinn macht, die URL zu erhalten, auf die niemand zugreifen kann. Sie können dies tun, indem Sie die ACL wie von Michael Astreiko vorgeschlagen festlegen. Sie können die Ressourcen-URL abrufen, indem Sie getResourceUrl oder getUrl aufrufen.

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

Note1: Der Unterschied zwischen getResourceUrl und getUrl ist, dass getResourceUrl bei Ausnahmebedingungen null zurückgibt.

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

79
hussachai

Sie können es selbst bestimmen, wenn Sie den Bucket und den Dateinamen angeben, den Sie in der Upload-Anforderung angeben.

z.B. Wenn Ihr Bucket mybucket ist und Ihre Datei myfilename heißt:

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

Das s3-Bit hängt von der Region ab, in der sich Ihr Bucket befindet. Zum Beispiel verwende ich die Region Südostasien, so dass meine URLs wie folgt aussehen:

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

Wenn Sie über s3Client einen Link erstellen möchten, können Sie dies auch unten verwenden.

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

ein bisschen alt, aber trotzdem für jeden, der in der Zukunft darüber stolpert:

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
);
2
rollcage

@ Hussachai und @ Jeffrey Kemp Antworten sind ziemlich gut. Sie haben jedoch etwas gemeinsam: Die zurückgegebene URL ist im Virtual-Host-Stil und nicht im Pfad-Stil. Weitere Informationen zum s3-URL-Stil finden Sie unter AWS S3-URL-Stile . Im Falle einiger Leute soll der Pfadstil s3 url generiert werden. Hier ist der Schritt. Grundsätzlich ist alles das Gleiche wie bei 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 erzeugt eine URL wie: https://s3.us-west-2.amazonaws.com/mybucket/myfilename

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

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

0
Omkar Ayachit