Share via


Java를 사용하여 블록 Blob 업로드

이 문서에서는 Java용 Azure Storage 클라이언트 라이브러리를 사용하여 블록 Blob을 업로드하는 방법을 보여 줍니다. 파일 경로, 스트림, 이진 개체 또는 텍스트 문자열에서 블록 Blob에 데이터를 업로드할 수 있습니다. 인덱스 태그를 사용하여 Blob을 업로드할 수도 있습니다.

필수 조건

  • 이 문서에서는 Java용 Azure Blob Storage 클라이언트 라이브러리로 작업하도록 프로젝트가 이미 설정되어 있다고 가정합니다. 패키지 설치, import 지시문 추가 및 권한 있는 클라이언트 개체 만들기를 포함하여 프로젝트를 설정하는 방법에 대한 자세한 내용은 Azure Storage 및 Java 시작을 참조하세요.
  • 권한 부여 메커니즘에는 업로드 작업을 수행할 수 있는 권한이 있어야 합니다. 자세한 내용은 다음 REST API 작업에 대한 권한 부여 지침을 참조하세요.

블록 Blob에 데이터 업로드

스트림 또는 이진 개체에서 블록 Blob을 업로드하려면 다음 메서드를 사용합니다.

파일 경로에서 블록 Blob을 업로드하려면 다음 메서드를 사용합니다.

이러한 각 메서드는 BlobClient 개체 또는 BlockBlobClient 개체를 사용하여 호출할 수 있습니다.

로컬 파일 경로에서 블록 Blob 업로드

다음 예제에서는 BlobClient 개체를 사용하여 블록 Blob에 파일을 업로드합니다.

public void uploadBlobFromFile(BlobContainerClient blobContainerClient) {
    BlobClient blobClient = blobContainerClient.getBlobClient("sampleBlob.txt");

    try {
        blobClient.uploadFromFile("filepath/local-file.png");
    } catch (UncheckedIOException ex) {
        System.err.printf("Failed to upload from file: %s%n", ex.getMessage());
    }
}

스트림에서 블록 Blob 업로드

다음 예제에서는 ByteArrayInputStream 개체를 만든 다음, 해당 스트림 개체를 업로드하여 블록 Blob을 업로드합니다.

public void uploadBlobFromStream(BlobContainerClient blobContainerClient) {
    BlockBlobClient blockBlobClient = blobContainerClient.getBlobClient("sampleBlob.txt").getBlockBlobClient();
    String sampleData = "Sample data for blob";
    try (ByteArrayInputStream dataStream = new ByteArrayInputStream(sampleData.getBytes())) {
        blockBlobClient.upload(dataStream, sampleData.length());
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

BinaryData 개체에서 블록 Blob 업로드

다음 예제에서는 BlobClient 개체를 사용하여 BinaryData를 블록 Blob에 업로드합니다.

public void uploadDataToBlob(BlobContainerClient blobContainerClient) {
    // Create a BlobClient object from BlobContainerClient
    BlobClient blobClient = blobContainerClient.getBlobClient("sampleBlob.txt");
    String sampleData = "Sample data for blob";
    blobClient.upload(BinaryData.fromString(sampleData));
}

구성 옵션을 사용하여 블록 Blob 업로드

Blob을 업로드할 때 클라이언트 라이브러리 구성 옵션을 정의할 수 있습니다. 이러한 옵션을 조정하여 성능을 개선하고 안정성을 향상시키고 비용을 최적화할 수 있습니다. 다음 코드 예제에서는 업로드 메서드를 호출할 때 BlobUploadFromFileOptions를 사용하여 구성 옵션을 정의하는 방법을 보여 줍니다. 파일에서 업로드하지 않는 경우 업로드 메서드에서 BlobParallelUploadOptions를 사용하여 유사한 옵션을 설정할 수 있습니다.

업로드할 때 데이터 전송 옵션 지정

ParallelTransferOptions의 값을 구성하여 데이터 전송 작업에 대한 성능을 향상시킬 수 있습니다. 앱의 요구 사항에 따라 업로드에 대해 다음 값을 조정할 수 있습니다.

  • blockSize: 각 요청에 대해 전송할 최대 블록 크기입니다. setBlockSizeLong 메서드를 사용하여 이 값을 설정할 수 있습니다.
  • maxSingleUploadSize: 데이터 크기가 이 값보다 작거나 같으면 청크로 나뉘지 않고 단일 배치로 업로드됩니다. 단일 실행에서 데이터를 업로드하면 블록 크기가 무시됩니다. setMaxSingleUploadSizeLong 메서드를 사용하여 이 값을 설정할 수 있습니다.
  • maxConcurrency: 단일 병렬 전송의 일부로 지정된 시간에 발급되는 최대 병렬 요청 수 setMaxConcurrency 메서드를 사용하여 이 값을 설정할 수 있습니다.

업로드에 ParallelTransferOptions를 사용하려면 다음 import 지시문이 있는지 확인합니다.

import com.azure.storage.blob.models.*;

다음 코드 예제에서는 ParallelTransferOptions에 대한 값을 설정하고 BlobUploadFromFileOptions 인스턴스의 일부로 옵션을 포함하는 방법을 보여 줍니다. 이 샘플에 제공된 값은 권장 사항이 아닙니다. 이러한 값을 올바르게 조정하려면 앱의 특정 요구 사항을 고려해야 합니다.

public void uploadBlockBlobWithTransferOptions(BlobContainerClient blobContainerClient, Path filePath) {
    String fileName = filePath.getFileName().toString();
    BlobClient blobClient = blobContainerClient.getBlobClient(fileName);

    ParallelTransferOptions parallelTransferOptions = new ParallelTransferOptions()
            .setBlockSizeLong((long) (4 * 1024 * 1024)) // 4 MiB block size
            .setMaxConcurrency(2)
            .setMaxSingleUploadSizeLong((long) 8 * 1024 * 1024); // 8 MiB max size for single request upload

    BlobUploadFromFileOptions options = new BlobUploadFromFileOptions(filePath.toString());
    options.setParallelTransferOptions(parallelTransferOptions);

    try {
        Response<BlockBlobItem> blockBlob = blobClient.uploadFromFileWithResponse(options, null, null);
    } catch (UncheckedIOException ex) {
        System.err.printf("Failed to upload from file: %s%n", ex.getMessage());
    }
}

데이터 전송 옵션 튜닝에 대한 자세한 내용은 Java를 사용하여 업로드 및 다운로드에 대한 성능 조정을 참조하세요.

인덱스 태그를 사용하여 블록 Blob 업로드

Blob 인덱스 태그는 키-값 태그 특성을 사용하여 스토리지 계정의 데이터를 분류합니다. 이러한 태그는 데이터를 쉽게 찾을 수 있도록 검색 가능한 다차원 인덱스로 자동으로 인덱싱되고 표시됩니다.

다음 예제에서는 BlobUploadFromFileOptions를 사용하여 인덱스 태그가 설정된 블록 Blob을 업로드합니다.

public void uploadBlockBlobWithIndexTags(BlobContainerClient blobContainerClient, Path filePath) {
    String fileName = filePath.getFileName().toString();
    BlobClient blobClient = blobContainerClient.getBlobClient(fileName);

    Map<String, String> tags = new HashMap<String, String>();
    tags.put("Content", "image");
    tags.put("Date", "2022-01-01");

    Duration timeout = Duration.ofSeconds(10);

    BlobUploadFromFileOptions options = new BlobUploadFromFileOptions(filePath.toString());
    options.setTags(tags);

    try {
        // Create a new block blob, or update the content of an existing blob
        Response<BlockBlobItem> blockBlob = blobClient.uploadFromFileWithResponse(options, timeout, null);
    } catch (UncheckedIOException ex) {
        System.err.printf("Failed to upload from file: %s%n", ex.getMessage());
    }
}

업로드 시 Blob의 액세스 계층 설정

BlobUploadFromFileOptions 클래스를 사용하여 업로드 시 Blob의 액세스 계층을 설정할 수 있습니다. 다음 코드 예제에서는 BLOB을 업로드할 때 액세스 계층을 설정하는 방법을 보여 줍니다.

public void uploadBlobWithAccessTier(BlobContainerClient blobContainerClient, Path filePath) {
    String fileName = filePath.getFileName().toString();
    BlobClient blobClient = blobContainerClient.getBlobClient(fileName);

    BlobUploadFromFileOptions options = new BlobUploadFromFileOptions(filePath.toString())
            .setTier(AccessTier.COOL);

    try {
        Response<BlockBlobItem> blockBlob = blobClient.uploadFromFileWithResponse(options, null, null);
    } catch (UncheckedIOException ex) {
        System.err.printf("Failed to upload from file: %s%n", ex.getMessage());
    }
}

액세스 계층 설정은 블록 Blob에서만 허용됩니다. 블록 Blob에 대한 액세스 계층을 Hot, Cool, Cold 또는 Archive로 설정할 수 있습니다. 액세스 계층을 Cold로 설정하려면 최소 클라이언트 라이브러리 버전, 12.21.0을 사용해야 합니다.

액세스 계층에 대한 자세한 내용은 액세스 계층 개요를 참조하세요.

블록을 준비하고 커밋하여 블록 Blob 업로드

개별 데이터 블록을 수동으로 스테이징하여 업로드를 블록으로 나누는 방법을 보다 효율적으로 제어할 수 있습니다. Blob을 구성하는 모든 블록이 준비되면 Blob Storage에 커밋할 수 있습니다. 이 접근방식을 사용하여 블록을 병렬로 업로드하여 성능을 향상시킬 수 있습니다.

public void uploadBlocks(BlobContainerClient blobContainerClient, Path filePath, int blockSize) throws IOException {
    String fileName = filePath.getFileName().toString();
    BlockBlobClient blobClient = blobContainerClient.getBlobClient(fileName).getBlockBlobClient();

    FileInputStream fileStream = new FileInputStream(filePath.toString());
    List<String> blockIDArrayList = new ArrayList<>();
    byte[] buffer = new byte[blockSize];
    int bytesRead;

    while ((bytesRead = fileStream.read(buffer, 0, blockSize)) != -1) {

        try (ByteArrayInputStream stream = new ByteArrayInputStream(buffer)) {
            String blockID = Base64.getEncoder().encodeToString(UUID.randomUUID().toString().getBytes(StandardCharsets.UTF_8));

            blockIDArrayList.add(blockID);
            blobClient.stageBlock(blockID, stream, buffer.length);
        }
    }

    blobClient.commitBlockList(blockIDArrayList);

    fileStream.close();
}

리소스

Java용 Azure Blob Storage 클라이언트 라이브러리를 사용하여 Blob을 업로드하는 방법에 대한 자세한 내용은 다음 리소스를 참조하세요.

REST API 작업

Java용 Azure SDK에는 Azure REST API를 기반으로 빌드되는 라이브러리가 포함되어 있으므로 익숙한 Java 패러다임을 통해 REST API 작업과 상호 작용할 수 있습니다. Blob을 업로드하기 위한 클라이언트 라이브러리 메서드는 다음 REST API 작업을 사용합니다.

코드 샘플

클라이언트 라이브러리 리소스

참고 항목