すべてのプロダクト
Search
ドキュメントセンター

:Dataflow SDKのマルチパートアップロードを実装するためのサンプルコード

最終更新日:Feb 26, 2024

署名の概要

Java SDK for OSSは、マルチパートアップロードのサンプルを提供します。 特定のコードは、ローカルファイルのマルチパートアップロードを実装するために使用されます。 しかしながら、実際の使用プロセスでは、サーバは、ネットワークフローデータを取得し、マルチパートアップロードのためにそれを使用し得る。 この方法では、ファイルをアップロードする前にネットワークフローデータをローカルファイルとして保存する必要があります。これには、中間ストレージの再アップロード、つまり非リアルタイムアップロードが含まれます。 このトピックでは、Dataflowでのマルチパートアップロードの実装例を示します。

詳細

データストリームのマルチパートアップロードでは、データストリームに対してクローン操作を実行する必要があります。この操作では、inputstreamを繰り返し読み取ることはできません。 以下は、データストリームマルチパートアップロードのサンプルコードです。

説明

: コード内のcloneInputStreamは、データストリームのコピーの実装です。

java.io.ByteArrayInputStreamをインポートします。java.io.ByteArrayOutputStreamをインポートします。java.io. ファイルをインポートします。java.io.FileInputStreamをインポートします。java.io.IOExceptionをインポートします。java.io.InputStreamをインポートします。java.util.ArrayListをインポートします。java.util.Listをインポートします。com.aliyun.oss.OSSをインポートします。com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.mo del.CompleteMultipartUploadRequestをインポートします。com.aliyun.oss.mo del.CompleteMultipartUploadResultをインポートします。import com.aliyun.oss.mo del.InitiateMultipartUploadRequest;
com.aliyun.oss.mo delをインポートします。InitiateMultipartUploadResult;
com.aliyun.oss.mo del.PartETagをインポートします。import com.aliyun.oss.mo del.UploadPartRequest;
com.aliyun.oss.mo del.UploadPartResultをインポートします。public class MutilpartUpload {
public static void main(String[] args) {
// エンドポイント杭州を例にとる。 必要に応じて他のリージョンに記入してください。 
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// Alibaba CloudアカウントのAccessKeyはすべてのAPIにアクセスできます。 Resource Access Management (RAM) ユーザーの資格情報を使用して、API操作を呼び出したり、定期的な操作とメンテナンスを実行したりすることを推奨します。 RAMユーザーを作成するには、RAMコンソールにログインします。 
文字列accessKeyId = "xxx";
文字列accessKeySecret = "xxx";
String bucketName = "dahecs1";
// <yourObjectName> は、オブジェクトをOSSにアップロードするときに、ファイルサフィックスを含む完全なパスを指定する必要があることを示します。たとえば、abc/efg/123.jpg. 
文字列objectName = "11/aaaatest11123";

String filePath = "/Users/wanghe/Downloads/aaaatest111";

// OSSClientインスタンスを作成します。 
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// InitiateMultipartUploadRequestオブジェクトを作成します。 
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);

// 部品の初期化時にファイルストレージタイプを設定するには、次のサンプルコードを参照してください。 
// ObjectMetadata metadata=新しいObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// request.setObjectMetadata (メタデータ);

// シャーディングを初期化します。 
InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload (要求);
// マルチパートアップロードイベントの一意の識別子であるuploadIdを返します。 マルチパートアップロードのキャンセルやマルチパートアップロードのクエリなど、このuploadIdに基づいて関連操作を開始できます。 
文字列uploadId = upresult.getUploadId();

// partETagsはPartETagsのコレクションです。 A PartETag consists of an ETag and a part number. 
List<PartETag> partETags = new ArrayList<PartETag>();
// ファイルのパーツ数を計算します。 
try {
InputStream instream = new FileInputStream(filePath);

final long partSize = 1*1024 * 1024L; // 1MB
final File sampleFile=新しいファイル (filePath);
long fileLength1 = sampleFile.length();
long fileLength = instream.available();
int partCount = (int) (fileLength / partSize);
if (fileLength % partSize !=0) {
partCount ++;
}
// トラバースマルチパートアップロード。 
ByteArrayOutputStream baos = cloneInputStream(instream);
// InputStream stream2 = null;
for (int i = 0; i < partCount; i ++) {
System.out.println("i= " i);
long startPos = i * partSize;
long curPartSize = (i + 1 == partCount) ? (fileLength - startPos) : partSize;
InputStream stream1=新しいByteArrayInputStream(baos.toByteArray());
System.out.println("length" + stream1.available());
// InputStream instream = new FileInputStream(sampleFile);
// アップロードしたパーツをスキップします。 
stream1.skip(startPos);
UploadPartRequest uploadPartRequest = new UploadPartRequest();
uploadPartRequest.setBucketName(bucketName);
uploadPartRequest.setKey(objectName);
uploadPartRequest.setUploadId(uploadId);
uploadPartRequest.setInputStream(stream1);
// シャードサイズを設定します。 最後の部分を除く各部分のサイズは100 KBより大きくなければなりません。 
uploadPartRequest.setPartSize(curPartSize);
// 部品番号を設定します。 Each part is configured with a part number. 数は1から10000の範囲です。 If you configure a number beyond the range, OSS returns an InvalidArgument error code. 
uploadPartRequest.setPartNumber( i + 1);
// 各パーツは順番にアップロードする必要はなく、別のクライアントにアップロードすることもできます。 OSSは部品番号をソートして完全なファイルを作成します。 
UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);
// 各パーツのアップロード後、OSSから返される結果にPartETagが含まれます。 The PartETag is stored in partETags. 
partETags.add(uploadPartResult.getPartETag());
if (stream1 !=null) {
try {
stream1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


// CompleteMultipartUploadRequestオブジェクトを作成します。 
// マルチパートアップロード操作を完了するには、すべての有効なpartETagsを指定する必要があります。 OSSがpartETagsを受信すると、OSSはすべての部分の有効性を1つずつ検証します。 すべての部品が検証された後、OSSはこれらの部品を完全なオブジェクトに結合します。 
CompleteMultipartUploadRequest completeMultipartUploadRequest=
新しいCompleteMultipartUploadRequest(bucketName、objectName、uploadId、partETags);

// オブジェクトのアップロードと同時にオブジェクトのアクセス許可を設定する必要がある場合は、次のサンプルコードを参照してください。 
// completeMultipartUploadRequest.setObjectACL(CannedAccessControlList.PublicRead);

// アップロードを完了します。 
CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.com pleteMultipartUpload(completeMultipartUploadRequest);
baos.close();
// OSSClientを無効にします。 
ossClient.shutdown();

} catch (IOException e) {
e.printStackTrace();
}
}

プライベート静的ByteArrayOutputStream cloneInputStream(InputStream入力) {
try {
ByteArrayOutputStream baos=新しいByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = input.read(buffer)) > -1) {
baos.write (バッファ, 0, len);
}
baos.flush();
戻りbaos;
} catch (IOException e) {
e.printStackTrace();
nullを返します。}
}

}



































































































































参考資料

OSSでのマルチパートアップロードの詳細については、「マルチパートアップロード」をご参照ください。

に適用可能

  • OSS