# Java
**AWS SDK for Java 2.x** — Java uchun rasmiy SDK. Misollar Java 17+ va SDK 2.30+ versiyasi uchun moʻljallangan.
## Oʻrnatish
`pom.xml` ga bogʻliqliklarni qoʻshing (Maven):
```xml
software.amazon.awssdk
bom
2.31.0
pom
import
software.amazon.awssdk
s3
software.amazon.awssdk
s3-transfer-manager
```
Gradle uchun: `implementation(platform("software.amazon.awssdk:bom:2.31.0"))`, `implementation("software.amazon.awssdk:s3")` va `implementation("software.amazon.awssdk:s3-transfer-manager")`.
## Kirish kalitlari
Kalitlarni muhit oʻzgaruvchilari orqali uzating — SDK ularni avtomatik oʻqiydi. Kalitlarni hech qachon manba kodida va repozitoriyda saqlamang.
```bash
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
```
## Mijoz yaratish
```java
import java.net.URI;
import software.amazon.awssdk.core.checksums.RequestChecksumCalculation;
import software.amazon.awssdk.core.checksums.ResponseChecksumValidation;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
static final URI ENDPOINT = URI.create("https://s3.uzcstorage.uz");
static final Region REGION = Region.of("default");
static final String BUCKET = "my-bucket";
S3Client s3 = S3Client.builder()
.region(REGION)
.endpointOverride(ENDPOINT)
.forcePathStyle(true)
.requestChecksumCalculation(RequestChecksumCalculation.WHEN_REQUIRED)
.responseChecksumValidation(ResponseChecksumValidation.WHEN_REQUIRED)
.build();
```
`S3Client` oqimlar uchun xavfsiz: uni bir marta yarating va butun ilovada qayta foydalaning. Kalitlar muhit oʻzgaruvchilaridan avtomatik oʻqiladi.
## Asosiy amallar
```java
import java.nio.file.Paths;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.core.sync.ResponseTransformer;
import software.amazon.awssdk.services.s3.model.*;
// Upload a file
s3.putObject(r -> r.bucket(BUCKET).key("docs/report.pdf").contentType("application/pdf"),
RequestBody.fromFile(Paths.get("report.pdf")));
// Upload a string
s3.putObject(r -> r.bucket(BUCKET).key("docs/hello.txt"), RequestBody.fromString("Hello, UzCloud!"));
// Download to a file
s3.getObject(r -> r.bucket(BUCKET).key("docs/report.pdf"),
ResponseTransformer.toFile(Paths.get("report-copy.pdf")));
// Read a small object into memory
String text = s3.getObjectAsBytes(r -> r.bucket(BUCKET).key("docs/hello.txt")).asUtf8String();
// Copy and delete
s3.copyObject(r -> r.sourceBucket(BUCKET).sourceKey("docs/report.pdf")
.destinationBucket(BUCKET).destinationKey("archive/report.pdf"));
s3.deleteObject(r -> r.bucket(BUCKET).key("docs/report.pdf"));
```
## Barcha obyektlar roʻyxati
Bitta soʻrov koʻpi bilan 1 000 ta obyektni qaytaradi. Prefiksli barcha obyektlarni olish uchun paginatordan foydalaning:
```java
s3.listObjectsV2Paginator(r -> r.bucket(BUCKET).prefix("docs/"))
.contents()
.forEach(o -> System.out.println(o.key() + " " + o.size()));
```
## Katta fayllar
**S3 Transfer Manager** katta fayllarni qismlarga boʻlib, parallel yuklaydi va yuklab oladi. U asinxron mijoz ustida ishlaydi:
```java
import software.amazon.awssdk.services.s3.S3AsyncClient;
import software.amazon.awssdk.transfer.s3.S3TransferManager;
import software.amazon.awssdk.transfer.s3.model.UploadFileRequest;
import software.amazon.awssdk.transfer.s3.progress.LoggingTransferListener;
S3AsyncClient asyncS3 = S3AsyncClient.builder()
.region(REGION)
.endpointOverride(ENDPOINT)
.forcePathStyle(true)
.requestChecksumCalculation(RequestChecksumCalculation.WHEN_REQUIRED)
.responseChecksumValidation(ResponseChecksumValidation.WHEN_REQUIRED)
.multipartEnabled(true)
.multipartConfiguration(c -> c.minimumPartSizeInBytes(64L * 1024 * 1024))
.build();
try (S3TransferManager tm = S3TransferManager.builder().s3Client(asyncS3).build()) {
tm.uploadFile(UploadFileRequest.builder()
.putObjectRequest(r -> r.bucket(BUCKET).key("backups/backup.tar.gz"))
.source(Paths.get("backup.tar.gz"))
.addTransferListener(LoggingTransferListener.create())
.build())
.completionFuture()
.join();
}
```
## Oqimli uzatish
Katta obyektni xotiraga toʻliq yuklamaslik uchun uni qismlarga boʻlib oʻqing va yozing:
```java
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
try (InputStream in = s3.getObject(r -> r.bucket(BUCKET).key("media/video.mp4"));
OutputStream out = Files.newOutputStream(Paths.get("video-copy.mp4"))) {
in.transferTo(out);
}
// Upload from a stream of known length (for example, an uploaded file in a web app)
try (InputStream in = Files.newInputStream(Paths.get("video.mp4"))) {
long size = Files.size(Paths.get("video.mp4"));
s3.putObject(r -> r.bucket(BUCKET).key("media/video.mp4"), RequestBody.fromInputStream(in, size));
}
```
## Presigned URL
Presigned URL kalitlarni bermasdan obyektga vaqtinchalik kirish imkonini beradi. Yuklash havolasi brauzer yoki boshqa xizmatga faylni bevosita bucketga yuklash imkonini beradi — **[Presigned URL](../objects/presigned-url.md)** va **[CORS](../buckets/cors.md)** ga qarang.
```java
import java.time.Duration;
import software.amazon.awssdk.services.s3.S3Configuration;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
try (S3Presigner presigner = S3Presigner.builder()
.region(REGION)
.endpointOverride(ENDPOINT)
.serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).build())
.build()) {
// Download link, valid for 1 hour
String getUrl = presigner.presignGetObject(p -> p
.signatureDuration(Duration.ofHours(1))
.getObjectRequest(r -> r.bucket(BUCKET).key("docs/report.pdf"))).url().toString();
// Upload link, valid for 10 minutes
String putUrl = presigner.presignPutObject(p -> p
.signatureDuration(Duration.ofMinutes(10))
.putObjectRequest(r -> r.bucket(BUCKET).key("uploads/photo.jpg").contentType("image/jpeg"))).url().toString();
}
```
## Xatolar va qayta urinishlar
Eng keng tarqalgan xatolar — obyekt mavjud emas (`NoSuchKey` yoki `HeadObject` uchun `404`) va kirish huquqi yoʻq (`AccessDenied`, `403`). Tarmoq xatolari va `5xx` javoblari avtomatik qayta urinib koʻriladi; urinishlar soni mijoz yaratilganda belgilanadi.
```java
import software.amazon.awssdk.services.s3.model.NoSuchKeyException;
import software.amazon.awssdk.services.s3.model.S3Exception;
boolean objectExists(String key) {
try {
s3.headObject(r -> r.bucket(BUCKET).key(key));
return true;
} catch (NoSuchKeyException e) {
return false;
}
}
try {
s3.getObject(r -> r.bucket(BUCKET).key("missing.txt"));
} catch (NoSuchKeyException e) {
System.out.println("Object not found");
} catch (S3Exception e) {
if (e.statusCode() == 403) System.out.println("Check the keys and the bucket policy");
else throw e;
}
```
## Spring Boot
Mijozni bean sifatida roʻyxatdan oʻtkazing va kerakli joyga kiriting. Manzil va bucketni `application.yml` da saqlang:
```yaml
uzcloud:
s3:
endpoint: https://s3.uzcstorage.uz
bucket: my-bucket
```
```java
@Configuration
public class S3Config {
@Bean
S3Client s3Client(@Value("${uzcloud.s3.endpoint}") String endpoint) {
return S3Client.builder()
.region(Region.of("default"))
.endpointOverride(URI.create(endpoint))
.forcePathStyle(true)
.requestChecksumCalculation(RequestChecksumCalculation.WHEN_REQUIRED)
.responseChecksumValidation(ResponseChecksumValidation.WHEN_REQUIRED)
.build();
}
}
```
> [!TIP]
> **Shuningdek qarang:**
>
> - **[Ulanish parametrlari](../connection.md)**