Примеры использования потоковой записи данных в хранилище объектов

Примеры использования потоковой записи данных в хранилище объектов#

В этом разделе приведены примеры использования потоковой записи данных в хранилище объектов для разных языков программирования. Потоковая запись основана на технологии подписи по частям, что позволяет увеличить скорость передачи данных в хранилище.

Эта возможность является относительно новой, поэтому она может не поддерживаться некоторыми программными платформами и клиентскими приложениями.

Go

package main

import (
    "context"
    "log"
    "os"

    minio "github.com/minio/minio-go/v7"
    "github.com/minio/minio-go/v7/pkg/credentials"
)

func main() {
    s3Host, isSet := os.LookupEnv("S3_HOST")
    if !isSet {
        log.Fatalln("S3_HOST is not set")
    }

    s3AccessKeyId, isSet := os.LookupEnv("S3_ACCESS_KEY_ID")
    if !isSet {
        log.Fatalln("S3_ACCESS_KEY_ID is not set")
    }

    s3SecretAccessKey, isSet := os.LookupEnv("S3_SECRET_ACCESS_KEY")
    if !isSet {
        log.Fatalln("S3_SECRET_ACCESS_KEY is not set")
    }

    s3Client, err := minio.New(s3Host, &minio.Options{
        Creds:  credentials.NewStaticV4(s3AccessKeyId, s3SecretAccessKey, ""),
        Secure: false,
    })

    if err != nil {
        log.Fatalln(err)
    }

    s3Bucket, isSet := os.LookupEnv("S3_BUCKET")
    if !isSet {
        log.Fatalln("S3_BUCKET is not set")
    }

    s3Object, isSet := os.LookupEnv("S3_OBJECT")
    if !isSet {
        log.Fatalln("S3_OBJECT is not set")
    }

    n, err := s3Client.PutObject(context.Background(), s3Bucket, s3Object, os.Stdin, -1, minio.PutObjectOptions{ContentType: "application/octet-stream"})
    if err != nil {
        log.Fatalln(err)
    }

    log.Println("Uploaded size: ", n)
}

Пример запуска программы:

CGO_ENABLED=0 go build -o stream-object

export S3_HOST="<S3_HOST>"
export S3_ACCESS_KEY_ID="<S3_ACCESS_KEY_ID>"
export S3_SECRET_ACCESS_KEY="<S3_SECRET_ACCESS_KEY>"
export S3_BUCKET="<S3_BUCKET>"
export S3_OBJECT="<S3_OBJECT>"

cat /dev/urandom | ./stream-object

.NET

class Example {
  private static IAmazonS3 s3Client;

  public static void Main(string[] args) {
    var accessKey = "<S3_ACCESS_KEY_ID>";
    var secretKey = "<S3_SECRET_ACCESS_KEY>";
    var credentials = new BasicAWSCredentials(accessKey, secretKey);
    s3Client = new AmazonS3Client(credentials, new AmazonS3Config {
      ServiceURL = "<S3_HOST>",
    });

    PutObject().Wait();
  }

  static async Task PutObject() {
    var request = new PutObjectRequest {
      FilePath = @ "<FILE_TO_UPLOAD>",
      BucketName = "<S3_BUCKET>",
      DisablePayloadSigning = false
    };

    var response = await s3Client.PutObjectAsync(request);

    Console.WriteLine("ETag: {0}", response.ETag);
  }
}

Java

import com.aliyun.oss.OSSClient;

public class Sample {
    public static void main(String[] args) {
        String accessKeyId = "<S3_ACCESS_KEY_ID>";
        String accessKeySecret = "<S3_SECRET_ACCESS_KEY>";
        String endpoint = "<S3_HOST>";

        // Initializes an OSSClient
        OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret);

        File file = new File("<FILE_TO_UPLOAD>");
        // Sets each part to 5M
        final int partSize = 5 * 1024 * 1024;
        int fileSize = (int) file.length();
        // Calculates the number of parts
        final int partCount = (file.length() % partSize != 0) ? (fileSize / partSize + 1) : (fileSize / partSize);
        List<PartETag> partETags = new ArrayList<PartETag>();

        for (int i = 0; i < partCount; i++) {
            InputStream fin = new BufferedInputStream(new FileInputStream(file));
            fin.skip(i * partSize);
            int size = (i + 1 == partCount) ? (fileSize - i * partSize) : partSize;

            UploadPartRequest req = new UploadPartRequest();
            req.setBucketName("<S3_BUCKET>");
            req.setKey(key);
            req.setPartNumber(i + 1);
            req.setPartSize(size);
            req.setUploadId(uploadId);
            req.setInputStream(fin);
            req.setUseChunkEncoding(true); // Uses chunked encoding

            UploadPartResult result = client.uploadPart(req);
            partETags.add(result.getPartETag());

            fin.close();
        }
    }
}

Конфигурация Maven:

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.18.1</version>
</dependency>

C++

Aws::String bucketName = Aws::String ("<S3_BUCKET>");
Aws::String fileName = Aws::String ("<S3_OBJECT>");

Aws::Client::ClientConfiguration clientConfig;
clientConfig.endpointOverride = Aws::String ("<S3_HOST>");
clientConfig.scheme = Aws::Http::Scheme::HTTPS;
clientConfig.connectTimeoutMs = 5000000;
clientConfig.requestTimeoutMs = 6000000;
clientConfig.region = Aws::Region::EU_WEST_1;

Aws::S3::S3Client s3Client(Aws::Auth::AWSCredentials("<S3_ACCESS_KEY_ID>", "<S3_SECRET_ACCESS_KEY>"), clientConfig);

Aws::S3::Model::PutObjectRequest request;
request.SetBucket(bucketName);
request.SetKey(fileName);

std::shared_ptr<Aws::IOStream> inputData =
        Aws::MakeShared<Aws::FStream>("SampleAllocationTag",
                                      fileName.c_str(),
                                      std::ios_base::in | std::ios_base::binary);

if (!*inputData) {
    std::cerr << "Error unable to read file " << fileName << std::endl;
    return false;
}

request.SetBody(inputData);

Aws::S3::Model::PutObjectOutcome outcome =
        s3Client.PutObject(request);

if (!outcome.IsSuccess()) {
    std::cerr << "Error: putObject: " <<
              outcome.GetError().GetMessage() << std::endl;
} else {
    std::cout << "Added object '" << fileName << "' to bucket '"
              << bucketName << "'.";
}

Дополнительные примеры можно посмотреть в документации Amazon.