簡體   English   中英

通過 Groovy 將文件上傳到 Amazon S3

[英]File Upload to Amazon S3 via Groovy

我正在嘗試使用 Groovy 腳本將文件上傳到 Amazon S3 存儲桶。 我嘗試了以下代碼

@Grab( 'net.java.dev.jets3t:jets3t:0.9.0' )
import org.jets3t.service.impl.rest.httpclient.RestS3Service
import org.jets3t.service.security.AWSCredentials
import org.jets3t.service.model.*
import java.io.*;

bucketName='bucketname'
accessKey='accesskey'
secretKey='secretkey'
folder='D:/'

public putS3() {}
def login = new AWSCredentials( accessKey, secretKey )
def expiry = new GregorianCalendar( 2011,0,1 ).time
def s3 = new RestS3Service( login ) 
def bucket = new S3Bucket( bucketName )
args.each{fileName->
        def key="$folder/$fileName"
        def s3obj=new S3Object(bucket,newFile('D:/sample.txt'))
        s3obj.key = key
        println "\nUploading $fileName to $bucketName/$key"
        s3obj = s3.putObject( bucket, s3obj )
        def link = s3.createSignedGetUrl( bucketName, key, login, expiry, false )
        println "$fileName : $link"
        }

args 塊中的代碼沒有被執行。 當我在 Groovy 控制台中執行此操作時,它會將結果顯示為 []。 請幫助我哪里出錯了?

我沒有要測試的 S3 帳戶,但這里有一個基於文檔的簡單示例

import org.jets3t.service.impl.rest.httpclient.RestS3Service
import org.jets3t.service.model.S3Bucket
import org.jets3t.service.model.S3Object
import org.jets3t.service.security.AWSCredentials

@Grab('net.java.dev.jets3t:jets3t:0.9.0')

accessKey = 'accesskey'
secretKey = 'secretkey'
bucketName = 'bucketname'
fileName = 'D:\\sample.txt'

credentials = new AWSCredentials(accessKey, secretKey)
service = new RestS3Service(credentials)
bucket = new S3Bucket(bucketName)
file = new File(fileName)
fileObject = new S3Object(file)
fileObject.key = fileName
service.putObject(bucket, fileObject)
expiryTime = new Date() + 1 // 24 hours from current date
link = service.createSignedGetUrl(bucket.name, fileObject.key, expiryTime)
println "$fileName : $link"

我最近在嘗試編寫一個快速 groovy 以上傳到 S3 Bucket 時遇到了這個例子,但是,我所有的嘗試都以 301 告終

org.jets3t.service.S3ServiceException: Service Error Message. -- ResponseCode: 301, ResponseStatus: Moved Permanently, XML Error Message: <?xml version="1.0" encoding="UTF-8"?><Error><Code>PermanentRedirect</Code><Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message><Endpoint>bucketname.s3.amazonaws.com</Endpoint><Bucket>bucketname</Bucket><RequestId>4CF5EDE9EF604DBB</RequestId><HostId>89KoQLvd93pXhnxJGcEaziSrSOPFRNXqbfPfY7LTe03z5rvVLAVx7UnFkts/Qe1fQ7eOWsaAL7A=</HostId></Error>
    at org.jets3t.service.S3Service.putObject(S3Service.java:2358)
    at org.jets3t.service.S3Service$putObject.call(Unknown Source)
    at awsBucketDrop.run(awsBucketDrop.groovy:21)

起初我認為這是一個存儲桶位置問題,因為我在 301 附近找到了參考,但是我修改了代碼以交換到存儲桶位置,但無濟於事。


import org.jets3t.service.model.S3Bucket
import org.jets3t.service.model.S3Object
import org.jets3t.service.security.AWSCredentials

@Grab('net.java.dev.jets3t:jets3t:0.9.4')

accessKey = '<key>'
secretKey = '<secret>'
bucketName = '<bucketname>'
fileName = '<fileLocation>'

credentials = new AWSCredentials(accessKey, secretKey)
service = new RestS3Service(credentials)
bucket = new S3Bucket(bucketName,"eu-west-1")
println bucket.getLocation()
file = new File(fileName)
fileObject = new S3Object(file)
fileObject.key = fileName
service.putObject(bucket, fileObject)
expiryTime = new Date() + 1 // 24 hours from current date
link = service.createSignedGetUrl(bucket.name, fileObject.key, expiryTime)
println "$fileName : $link"

現在,這個 sdk 自 2015 年以來一直沒有更新,所以它是一個相當老的 SDK,所以我覺得它不再兼容(並且可能有一些硬編碼的 url)但是如果你有類似的經歷,你設法解決了,讓我知道。

謝謝

如果你遇到了這個並且需要一個有效的 groovy,我已經松散地修改了這段代碼以作為一個簡單的 groovy


import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;

import java.io.File;
import java.io.IOException;

Regions clientRegion = Regions.EU_WEST_1;
String bucketName = "bucketname";
String stringObjKeyName = "stringObjKeyName";
String fileObjKeyName = "fileObjKeyName";
String fileName = "fileLocation";

try {
    //This code expects that you have AWS credentials set up per:
    // https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
    AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
            .withRegion(clientRegion)
            .build();

    // Upload a text string as a new object.
    s3Client.putObject(bucketName, stringObjKeyName, "Uploaded String Object");

    // Upload a file as a new object with ContentType and title specified.
    PutObjectRequest request = new PutObjectRequest(bucketName, fileObjKeyName, new File(fileName));
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentType("plain/text");
    metadata.addUserMetadata("x-amz-meta-title", "someTitle");
    request.setMetadata(metadata);
    s3Client.putObject(request);
} catch (AmazonServiceException e) {
    // The call was transmitted successfully, but Amazon S3 couldn't process
    // it, so it returned an error response.
    e.printStackTrace();
} catch (SdkClientException e) {
    // Amazon S3 couldn't be contacted for a response, or the client
    // couldn't parse the response from Amazon S3.
    e.printStackTrace();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM