Примеры использования потоковой записи данных в хранилище объектов#
В этом разделе приведены примеры использования потоковой записи данных в хранилище объектов для разных языков программирования. Потоковая запись основана на технологии подписи по частям, что позволяет увеличить скорость передачи данных в хранилище.
Эта возможность является относительно новой, поэтому она может не поддерживаться некоторыми программными платформами и клиентскими приложениями.
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.