核心组件:
my-app-images
)user/avatar.jpg
)oss-cn-hangzhou.aliyuncs.com
)<dependency>
<groupId>com.aliyun.ossgroupId>
<artifactId>aliyun-sdk-ossartifactId>
<version>3.16.1version>
dependency>
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
// 配置访问密钥(建议从环境变量/配置中心读取)
String endpoint = "oss-cn-hangzhou.aliyuncs.com";
String accessKeyId = "your-access-key-id";
String accessKeySecret = "your-access-key-secret";
// 创建OSSClient实例
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
String bucketName = "my-java-bucket-2023";
// 检查Bucket是否存在
boolean exists = ossClient.doesBucketExist(bucketName);
if (!exists) {
// 创建标准存储类型的Bucket(华东1杭州)
CreateBucketRequest request = new CreateBucketRequest(bucketName);
request.setStorageClass(StorageClass.Standard);
request.setCannedACL(CannedAccessControlList.Private);
ossClient.createBucket(request);
System.out.println("Bucket创建成功");
}
String objectName = "documents/report.pdf";
File file = new File("/local/path/report.pdf");
// 执行上传(自动识别Content-Type)
ossClient.putObject(bucketName, objectName, file);
// 可选:设置元数据
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("application/pdf");
metadata.addUserMetadata("author", "John");
ossClient.putObject(bucketName, objectName, new FileInputStream(file), metadata);
// 初始化分片上传
InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(bucketName, objectName);
InitiateMultipartUploadResult initResult = ossClient.initiateMultipartUpload(initRequest);
// 设置分片大小(5MB)
long partSize = 5 * 1024 * 1024;
File sampleFile = new File("/local/path/large-video.mp4");
long fileLength = sampleFile.length();
int partCount = (int) (fileLength / partSize) + 1;
// 上传分片
List<PartETag> partETags = new ArrayList<>();
for (int i = 0; i < partCount; i++) {
long startPos = i * partSize;
long curPartSize = Math.min(partSize, fileLength - startPos);
UploadPartRequest uploadRequest = new UploadPartRequest()
.withBucketName(bucketName)
.withKey(objectName)
.withUploadId(initResult.getUploadId())
.withPartNumber(i + 1)
.withFileOffset(startPos)
.withPartSize(curPartSize)
.withInputStream(new FileInputStream(sampleFile));
UploadPartResult uploadResult = ossClient.uploadPart(uploadRequest);
partETags.add(uploadResult.getPartETag());
}
// 完成上传
CompleteMultipartUploadRequest completeRequest =
new CompleteMultipartUploadRequest(bucketName, objectName, initResult.getUploadId(), partETags);
ossClient.completeMultipartUpload(completeRequest);
String localFilePath = "/downloads/report.pdf";
OSSObject ossObject = ossClient.getObject(bucketName, objectName);
try (InputStream inputStream = ossObject.getObjectContent();
FileOutputStream outputStream = new FileOutputStream(localFilePath)) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
OSSObject ossObject = ossClient.getObject(bucketName, "text/note.txt");
try (BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
ObjectListing objectListing = ossClient.listObjects(bucketName);
for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
System.out.println("Object: " + objectSummary.getKey()
+ " Size: " + objectSummary.getSize());
}
ossClient.deleteObject(bucketName, "documents/old-report.pdf");
// 通过STS获取临时凭证(需RAM配置角色)
String stsAccessKeyId = "STS.YourAccessKeyId";
String stsAccessKeySecret = "YourAccessKeySecret";
String stsSecurityToken = "YourSecurityToken";
OSS stsOssClient = new OSSClientBuilder()
.build(endpoint, stsAccessKeyId, stsAccessKeySecret, stsSecurityToken);
// 使用KMS托管主密钥
KMSEncryptionMaterials encryptionMaterials = new KMSEncryptionMaterials(region, kmsKeyId);
EncryptionConfiguration config = new EncryptionConfiguration(encryptionMaterials);
CryptoConfiguration cryptoConfig = new CryptoConfiguration();
OSSEncryptionClient encryptionClient = new OSSEncryptionClientBuilder()
.build(endpoint, accessKeyId, accessKeySecret, config, cryptoConfig);
// 上传加密文件
encryptionClient.putObject(bucketName, "encrypted-data.bin", new File("/local/secret.dat"));
// 生成可公开访问的URL(有效期10分钟)
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName);
request.setExpiration(new Date(System.currentTimeMillis() + 10 * 60 * 1000));
URL signedUrl = ossClient.generatePresignedUrl(request);
System.out.println("预签名URL: " + signedUrl.toString());
// 自动删除30天前的日志文件
LifecycleRule rule = new LifecycleRule(
"delete-old-logs",
"logs/",
RuleStatus.Enabled,
30 // 30天后过期
);
LifecycleConfiguration configuration = new LifecycleConfiguration()
.withRules(Arrays.asList(rule));
SetBucketLifecycleRequest lifecycleRequest = new SetBucketLifecycleRequest(bucketName);
lifecycleRequest.setLifecycleConfiguration(configuration);
ossClient.setBucketLifecycle(lifecycleRequest);
客户端资源释放:
// 使用后务必关闭OSSClient
ossClient.shutdown();
异常处理:
try {
ossClient.putObject(bucketName, objectName, file);
} catch (OSSException | ClientException e) {
// 处理OSS特定异常
e.printStackTrace();
}
连接池配置:
ClientBuilderConfiguration config = new ClientBuilderConfiguration();
config.setMaxConnections(128); // 设置最大连接数
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret, config);
ossutil:
# 使用Java调用命令行工具
Process process = Runtime.getRuntime().exec("ossutil cp localfile oss://bucket/path");
OSS Browser(图形化工具):
日志分析:
// 开启访问日志
SetBucketLoggingRequest request = new SetBucketLoggingRequest(bucketName);
request.setTargetBucket("log-bucket");
request.setTargetPrefix("access-logs/");
ossClient.setBucketLogging(request);
通过以上Java代码示例,开发者可以快速实现与阿里云OSS的集成。