下载对象

您可以使用 getObject 接口下载对象,以下代码展示如何下载一个对象:

String bucketName = "<your-bucket-name>";
String objectKey = "<your-object-key>";
String localPath = "<your-local-path>"; // 本地存储路径
try {
    GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectKey);
    S3Object o = s3.getObject(getObjectRequest);
    S3ObjectInputStream s3is = o.getObjectContent();
    FileOutputStream fos = new FileOutputStream(new File(localPath));
    byte[] read_buf = new byte[1024];
    int read_len = 0;
    while ((read_len = s3is.read(read_buf)) > 0) {
        fos.write(read_buf, 0, read_len);
    }
    s3is.close();
    fos.close();
}
catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
} catch (FileNotFoundException e) {
    System.err.println(e.getMessage());
} catch (IOException e) {
    System.err.println(e.getMessage());
}

下载对象时,可以重写部分HTTP/HTTPS响应头信息。可重写的响应头信息见下表:

Java-sdk 方法 作用
ResponseHeaderOverrides.setContentType 重写HTTP/HTTPS响应中的 Content-Type
ResponseHeaderOverrides.setContentLanguage 重写HTTP/HTTPS响应中的 Content-Language
ResponseHeaderOverrides.setExpires 重写HTTP/HTTPS响应中的 Expires
ResponseHeaderOverrides.setCacheControl 重写HTTP/HTTPS响应中的 Cache-Control
ResponseHeaderOverrides.setContentDisposition 重写HTTP/HTTPS响应中的 Content-Disposition
ResponseHeaderOverrides.setContentEncoding 重写HTTP/HTTPS响应中的 Content-Encoding

以下代码展示如何在下载Object时设置 GetObjectRequest ,重写响应头信息:

GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectKey);
//设置Response响应头信息 Content-Type 为 video/mp4
ResponseHeaderOverrides responseHeaderOverrides = new ResponseHeaderOverrides();
responseHeaderOverrides.setContentType("video/mp4");
getObjectRequest.setResponseHeaders(responseHeaderOverrides);

S3Object o = s3.getObject(getObjectRequest);

下载文件时,可以指定一个或者多个限定条件,满足条件时才下载对象,不满足时则报错,不下载对象。可以使用的限定条件如下:

Java-sdk 方法 作用
GetObjectRequest.setModifiedSinceConstraint 如果指定的时间早于实际修改时间,则正常传送。否则返回错误。
GetObjectRequest.setUnmodifiedSinceConstraint 如果传入参数中的时间等于或者晚于文件实际修改时间,则正常传输文件;否则返回错误。
GetObjectRequest.setMatchingETagConstraints 如果传入的ETag和Object的 ETag匹配,则正常传输;否则返回错误。
GetObjectRequest.setNonmatchingETagConstraints 如果传入的ETag值和Object的ETag不匹配,则正常传输;否则返回错误。
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectKey);
//通过Date类设置一个时间
Date date = new Date();

//下载date早于实际修改时间的Object
getObjectRequest.setModifiedSinceConstraint(date);
S3Object o = s3.getObject(getObjectRequest);