从 V2 Java SDK 中的 S3 读取的超级简单的内容如下所示:
Region region = Region.US_WEST_2;
String bucketName = "file-store";
S3Client s3Client = S3Client.builder().region(region).build();
...
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.bucket(bucketName)
.key(id + "/files/" + id + ".txt")
.build();
OutputStream os = he.getResponseBody();
s3Client.getObject(getObjectRequest, ResponseTransformer.toOutputStream(outputStream));
os.close();
这将从 S3 下载文件并将字节直接写入 HTTP 响应中的输出流。如果您非常频繁地执行此操作,那么S3Client
应该在您进行读取的位置(即构造函数)之外创建并重用。
现在,这比你展示的更快吗?我强烈希望它会是,但我没有办法在你运行的负载下测试它。
另一种选择可能是创建客户端会请求的预签名 URL,然后他们可以直接从 S3 下载文件,而不通过您的服务器。我不确定这是否适用于您的用例。
编辑
我强烈建议您深入研究AWS Java SDK 文档,并针对您的用例,深入研究S3 示例。但在那之前,下面是一个获取文件的简单程序和两种不同的获取内容长度的方法。这个使用本地凭据 - 您的用例可能会有所不同。
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.core.exception.SdkClientException;
import software.amazon.awssdk.core.sync.ResponseTransformer;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.model.HeadObjectRequest;
import software.amazon.awssdk.services.s3.model.HeadObjectResponse;
import software.amazon.awssdk.services.s3.model.NoSuchKeyException;
import software.amazon.awssdk.services.s3.model.S3Exception;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class DownloadObjectV2 {
public static void main(String[] args) {
Region region = Region.US_EAST_1;
String bucketName = "the-bucket-name";
String fileObjKeyName = "file.txt";
String fileName = "/tmp/file.txt";
long startTime = System.currentTimeMillis();
try {
S3Client s3 = S3Client.builder()
.region(region)
.credentialsProvider(ProfileCredentialsProvider.create("profile-name"))
.build();
// get meta data about the object without downloading it
HeadObjectRequest headObjectRequest = HeadObjectRequest.builder()
.bucket(bucketName)
.key(fileObjKeyName)
.build();
HeadObjectResponse headObjectResponse = s3.headObject(headObjectRequest);
System.out.println("object is " + headObjectResponse.contentLength() + " bytes long from head call");
// get the object, save it to a file
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.bucket(bucketName)
.key(fileObjKeyName)
.build();
OutputStream outputStream = new FileOutputStream(fileName);
GetObjectResponse getObjectResponse = s3.getObject(getObjectRequest, ResponseTransformer.toOutputStream(outputStream));
// meta data is also available from the GetObjectResponse
System.out.println("object is " + getObjectResponse.contentLength() + " bytes long from get call");
}
catch( NoSuchKeyException nske ) { // bad key name
System.out.println( "the key does not exist" );
}
catch( S3Exception s3e ) { // errors like bad credentials
System.out.println( "a general s3 exception occurred: ");
s3e.printStackTrace();
}
catch( SdkClientException sce ) { // other errors
System.out.println( "a sdk exception occurred: ");
sce.printStackTrace();
}
catch( Exception e ) {
e.printStackTrace();
}
System.out.println( "run took " + (System.currentTimeMillis() - startTime) + "ms");
System.exit(0);
}
}