tencent cloud

Cloud Object Storage

ドキュメントCloud Object Storage

HarmonyOSからのダイレクトアップロード実践ガイド

Download
フォーカスモード
フォントサイズ
最終更新日: 2025-09-19 10:43:53
AI翻訳

概要

このドキュメントでは、SDKに依存せず、シンプルなコードを使用して、HarmonyOSからCloud Object Storage(COS)のバケットにファイルをダイレクトアップロードする方法について説明します。
注意:
このドキュメントの内容は、XMLバージョンのAPIに基づいています。

前提条件

COSコンソールにログインし、バケットを作成して、Bucket(バケット名)とRegion(リージョン名)を取得します。詳細については、バケットの作成をご参照ください。
CAMコンソールにログインし、プロジェクトのSecretIdとSecretKeyを取得します。

実装手順

全体的な手順は以下の通りです:
1. クライアントがサーバーサイドのインターフェースを呼び出してファイルサフィックスを渡すと、サーバーサイドがサフィックスとタイムスタンプなどに基づいてCOSキーとダイレクトアップロード用のURLを生成します。
2. サーバーサイドはSTS SDKを通じて一時キーを取得します。
3. サーバーサイドが取得した一時キーを使用してダイレクトアップロードURLに署名し、URL、署名、トークンなどの情報を返します。
4. クライアントがステップ3で取得した情報を受け取った後、直接putリクエストを送信し、署名やトークンなどのヘッダーを付与してアップロードを実行します。
具体的なコードはHarmonyOS例をご参照ください。

サーバーサイドにおける署名実装の設定

注意:
本番環境にデプロイする際は、サーバーサイドにご自身のウェブサイトの権限検証を設定してください。
セキュリティ上、バックエンドは一時キーを取得した後、ダイレクトアップロードURLを生成し、直接署名を行います。詳細はサーバーサイドでの署名実践をご参照ください。
具体的な手順は以下の通りです:
1. STS SDKを通じて一時キーを取得します。
2. サフィックスに基づいてcosキーとダイレクトアップロードURL関連の情報を生成します。
3. 一時キーを使用してダイレクトアップロードURLに署名し、URL、署名、トークンなどの情報を返します。
サーバーサイドの設定手順:
1. キー、バケット、およびリージョンを設定します。
var config = {
// Tencent Cloudのキーを取得します。権限が限定されたサブアカウントのキーを使用することを推奨します https://console.tencentcloud.com/cam/capi
secretId: process.env.COS_SECRET_ID,
secretKey: process.env.COS_SECRET_KEY,
// キーの有効期間
durationSeconds: 1800,
// ここにバケットとリージョンを入力します。例:test-1250000000、ap-guangzhou
bucket: process.env.PERSIST_BUCKET,
region: process.env.PERSIST_BUCKET_REGION,
// アップロードが制限されるサフィックス
extWhiteList: ['jpg', 'jpeg', 'png', 'gif', 'bmp'],
};
2. ターミナルで実行
npm install
3. サービスを起動
node app.js
ここでサーバーサイドの起動はしました。クライアントサイドのプロセスを開始できます。
他の言語や独自実装する場合は、以下の手順を参考にしてください:
1. サーバーサイドから一時キーを取得します。サーバーサイドはまず固定キー(SecretId、SecretKey)を使用してSTSサービスから一時キー(tmpSecretId、tmpSecretKey、sessionToken)を取得します。詳細については、一時キーの生成と利用ガイドまたはcos-sts-sdkをご参照ください。
2. ダイレクトアップロードURLに署名し、authorizationを生成します。
3. ダイレクトアップロードURL、authorization、sessionTokenなどの情報を返します。クライアントは、ファイルをアップロードする際に取得した署名とsessionTokenを、それぞれリクエストヘッダーのauthorizationとx-cos-security-tokenフィールドに設定します。

HarmonyOSクライアントでのアップロード例

1. サーバーサイドからダイレクトアップロードと署名情報をリクエストします。
import http from '@ohos.net.http';

/**
* ダイレクトアップロード用のURLと署名などを取得します
*
* @param ext ファイルのサフィックス。ダイレクトアップロードすると、バックエンドはサフィックスに基づいてCOSキーを生成します
* @returns ダイレクトアップロード用のURLと署名など
*/
public static async getStsDirectSign(ext: string): Promise<Object> {
// 各httpRequestは単一のHTTPリクエストタスクに対応し、再利用できません
let httpRequest = http.createHttp();
//ダイレクトアップロード署名サービスのサーバーURL(本番環境では、正規のダイレクトアップロード署名サービスURLに置き換えてください)
//ダイレクトアップロード署名サービスのサーバーコード例はこちらを参考:https://github.com/tencentyun/cos-demo/blob/main/server/direct-sign/nodejs/app.js
let url = "http://127.0.0.1:3000/sts-direct-sign?ext=" + ext;
try {
let httpResponse = await httpRequest.request(url, { method: http.RequestMethod.GET });
if (httpResponse.responseCode == 200) {
let result = JSON.parse(httpResponse.result.toString())
if (result.code == 0) {
return result.data;
} else {
console.info(`getStsDirectSign error code: ${result.code}, error message: ${result.message}`);
}
} else {
console.info("getStsDirectSign HTTP error code: " + httpResponse.responseCode);
}
} catch (err) {
console.info("getStsDirectSign Error sending GET request: " + JSON.stringify(err));
} finally {
// 当該リクエストの使用が完了したら、destroyメソッドを呼び出して破棄します。
httpRequest.destroy();
}
return null;
}
2. 取得したダイレクトアップロードと署名情報を使用して、ファイルのアップロードを開始します。
import http from '@ohos.net.http';
import promptAction from '@ohos.promptAction'
import fs from '@ohos.file.fs';
import request from '@ohos.request';
import common from '@ohos.app.ability.common';
import { MediaBean } from '../bean/MediaBean';
import { MediaHelper } from './MediaHelper';

/**
* ファイルをアップロード(uploadTask経由で実装)
* @param context context
* @param media メディアファイル
*/
public static async uploadFileByTask(context: common.Context, media: MediaBean, progressCallback: (uploadedSize: number, totalSize: number) => void) {
// ダイレクトアップロード署名などのデータを取得
let ext = MediaHelper.getFileExtension(media.fileName);
let directTransferData: any = await UploadHelper.getStsDirectSign(ext);
if (directTransferData == null) {
promptAction.showToast({ message: 'getStsDirectSign fail' });
return;
}
// ビジネスサーバーから返されたアップロード情報
let cosHost: String = directTransferData.cosHost;
let cosKey: String = directTransferData.cosKey;
let authorization: String = directTransferData.authorization;
let securityToken: String = directTransferData.securityToken;

// アップロード用URLを生成
let url = `https://${cosHost}/${cosKey}`;
try {
// uriファイルをcacheDirにコピー(request.uploadFileは、internal:形式のパスのみ受け付けるため)
let file = await fs.open(media.fileUri, fs.OpenMode.READ_ONLY);
let destPath = context.cacheDir + "/" + media.fileName;
await fs.copyFile(file.fd, destPath);
let realuri = "internal://cache/" + destPath.split("cache/")[1];

let uploadConfig = {
url: url,
header: {
"Content-Type": "application/octet-stream",
"Authorization": authorization,
"x-cos-security-token": securityToken,
"Host": cosHost
},
method: "PUT",
files: [{ filename: media.fileName, name: "file", uri: realuri, type: ext }],
data: []
};
// アップロードを開始
let uploadTask = await request.uploadFile(context, uploadConfig)

uploadTask.on('progress', progressCallback);
let upCompleteCallback = (taskStates) => {
for (let i = 0; i < taskStates.length; i++) {
promptAction.showToast({ message: 'アップロードしました' });
console.info("upOnComplete taskState:" + JSON.stringify(taskStates[i]));
}
};
uploadTask.on('complete', upCompleteCallback);

let upFailCallback = (taskStates) => {
for (let i = 0; i < taskStates.length; i++) {
promptAction.showToast({ message: 'アップロードに失敗しました' });
console.info("upOnFail taskState:" + JSON.stringify(taskStates[i]));
}
};
uploadTask.on('fail', upFailCallback);
} catch (err) {
console.info("uploadFile Error sending PUT request: " + JSON.stringify(err));
promptAction.showToast({ message: "uploadFile Error sending PUT request: " + JSON.stringify(err) });
}
}


ヘルプとサポート

この記事はお役に立ちましたか?

フィードバック