シナリオ
フォームアップロードを使用して、HTML webページにオブジェクトをアップロードできます。 たとえば、webアプリケーションでフォームアップロードを使用できます。 次の表では、求人検索Webサイトでフォームアップロードを使用する場合と使用しない場合のアップロードプロセスを比較しています。
フォームアップロード未使用 | フォームアップロード使用 |
Web ユーザーが履歴書のアップロードリクエストを送信します。 Web サーバーは履歴書アップロードページにレスポンスします。 履歴書が Web サーバーにアップロードされます。 Webサイトサーバーは、履歴書をObject Storage Service (OSS) にアップロードします。
| Web ユーザーが履歴書のアップロードリクエストを送信します。 Web サーバーは履歴書アップロードページにレスポンスします。 履歴書が OSS にアップロードされます。
|
フォームアップロードは、オブジェクトがWebサイトサーバーから転送されずにOSSに直接アップロードされる、より簡単なプロセスを提供します。
フォームアップロードでは、Webサイトサーバーをスケールアウトせずに多数のオブジェクトをアップロードできる、よりシンプルなアーキテクチャを使用することもできます。 フォームアップロードでは、オブジェクトはクライアントからOSSに直接アップロードされます。 OSSは、多数のオブジェクトがアップロードされたときにサービス品質を保証します。
使用上の注意
オブジェクトサイズ
フォームアップロードを使用して、最大5 GBのサイズのオブジェクトをアップロードできます。 サイズが5 GBを超えるオブジェクトをアップロードする場合は、マルチパートアップロードを使用します。 詳しくは、「マルチパートアップロード」をご参照ください。
オブジェクトの命名規則
PUTリクエスト料金の引き下げ
多数のオブジェクトをアップロードし、オブジェクトのストレージクラスをDeep Cold Archiveに設定する場合は、高いPUTリクエスト料金が請求されます。 オブジェクトのアップロード時にオブジェクトのストレージクラスを標準に設定し、標準オブジェクトのストレージクラスをDeep Cold Archiveに変換するようにライフサイクルルールを設定することを推奨します。 これにより、PUTリクエスト料金が削減されます。
セキュリティと認証機能
OSSでは、バケットとオブジェクトのアクセス制御リスト (ACL) を設定できます。 これにより、必要な権限が付与されていないサードパーティのユーザーは、バケットにデータをアップロードできません。 詳細については、「概要」をご参照ください。
OSSはアカウントレベルの権限付与を提供します。 これにより、サードパーティのユーザーにオブジェクトをOSSバケットにアップロードする権限を付与できます。 詳細は、「許可された第三者によるアップロード」をご参照ください。
オブジェクトのアップロードのパフォーマンス調整
多数のオブジェクトをアップロードし、オブジェクトの名前にタイムスタンプや文字などの連続したプレフィックスが含まれている場合、複数のオブジェクトインデックスが1つのパーティションに格納される可能性があります。 この場合、これらのオブジェクトをクエリするために多数のリクエストを送信すると、レイテンシが増加する可能性があります。 多数のオブジェクトをアップロードする場合は、オブジェクト名を指定するために、シーケンシャルプレフィックスではなくランダムプレフィックスを使用することをお勧めします。 詳細については、「OSSパフォーマンスとスケーラビリティのベストプラクティス」をご参照ください。
既存のオブジェクトが同じ名前のアップロードされたオブジェクトによって上書きされないようにするために使用されるメソッド
デフォルトでは、既存のオブジェクトは同じ名前のアップロードされたオブジェクトで上書きされます。 次の方法を使用して、既存のオブジェクトが予期せず上書きされないようにします。
バケットのバージョン管理を有効にします。
バケットのバージョン管理を有効にすると、バケット内で上書きされたオブジェクトは以前のバージョンとして保存されます。 以前のバージョンのオブジェクトを復元できます。 詳細については、「概要」をご参照ください。
アップロードリクエストにx-oss-forbid-overwriteパラメーターを含める
アップロードリクエストにx-oss-forbid-overwriteパラメーターを含め、パラメーターをtrueに設定します。 OSSで既存のオブジェクトと同じ名前のオブジェクトをアップロードすると、オブジェクトのアップロードに失敗し、FileAlreadyExists
エラーが返されます。 このパラメーターをアップロード要求に含めない場合、またはこのパラメーターをfalseに設定した場合、既存のオブジェクトと同じ名前のアップロードされたオブジェクトが既存のオブジェクトを上書きします。
手順
OSS SDKの使用
OSS SDK for Pythonを使用してフォームのアップロードを実行するには、次の手順を実行します。
次のコードを記述します。
#coding=utf8
hashlibのインポート
インポートbase64
hmacのインポート
optparse importからOptionParser
def convert_base64 (入力):
return base64.b64encode(input.encode(encoding='utf-8 ')).decode('utf-8')
def get_sign_policy(key, policy):
return base64.b64encode(hmac.new(key.encode(encoding='utf-8 ')), policy.encode(encoding='utf-8'), hashlib.sha1).digest().decode('utf-8 ')
def get_form (バケット、エンドポイント、access_key_id、access_key_secret、out):
# POSTポリシーを作成します。
# PostObjectリクエストのポリシーフォームフィールドは、リクエストの有効性を検証するために使用されます。 たとえば、アップロードするオブジェクトのサイズと名前、クライアントのリダイレクト先のURL、オブジェクトのアップロード後にクライアントが受け取るHTTPステータスコードを指定するようにポリシーを設定できます。
policy="{\"expiration\":\"2115-01-27T10:56:19Z\",\"conditions\":[[\"content-length-range\", 0, 1048576]]}"
print("policy: %s" % policy)
# Base64でポリシー文字列をエンコードします。
base64policy = convert_base64(policy)
print("base64_encode_policy: %s" % base64policy)
# OSSへのアクセスに使用されるアカウントのAccessKeyシークレットを使用して、Base64-encodedポリシーに署名を追加します。
signature = get_sign_policy(access_key_secret, base64policy)
# アップロード用のHTMLページを作成します。
form = '''
<html>
<meta http-equiv=content-type content="text/html; charset=UTF-8">
<head><title>OSSフォームのアップロード (PostObject操作を呼び出して)</title></head>
<body>
<form action="http://%s.%s" method="post" enctype="multipart/form-data">
<input type="text" name="OSSAccessKeyId" value="%s">
<input type="text" name="policy" value="%s">
<input type="text" name="Signature" value="%s">
<input type="text" name="key" value="upload/${filename}">
# オブジェクトのアップロード後にクライアントがリダイレクトされるページを指定します。 コードで指定したページを実際のページに置き換えることができます。
<input type="text" name="success_action_redirect" value="https://oss.aliyun.com">
# オブジェクトのアップロード後にHTTPステータスコード201が返されるように指定します。 要件に基づいて、返されるHTTPステータスコードを指定できます。
<input type="text" name="success_action_status" value="201">
<input name="file" type="file" id="file">
<input name="submit" value="Upload" type="submit">
</form>
</body>
</html>
''' % (bucket, endpoint, access_key_id, base64policy, signature)
f = open(out, "wb")
f.write(form.encode(encoding='utf-8 '))
f.close()
印刷 (「フォームは % sに保存されます」 % アウト)
if __name__ ='__main__':
parser = OptionParser()
parser.add_option("", "--bucket", dest="bucket", help="specify ")
parser.add_option("", "--endpoint", dest="endpoint", help="specify")
parser.add_option("", "--id", dest="id", help="access_key_id")
parser.add_option("", "--key", dest="key", help="access_key_secret")
parser.add_option("", "--out", dest="out", help="out put form")
(opts, args) = parser.parse_args()
if opts.bucket and opts.endpoint and opts.id and opts.key and opts.out:
get_form(opts.bucket, opts.endpoint, opts.id, opts.key, opts.out)
else:
print("python % s -- bucket=your-bucket -- endpoin t=oss-cn-hangzhou.aliyuncs.com -- id=your-access-key-id -- key=your-access-key-secret -- out=out-put-form-name" % ___file__)
上記のコードをpostobject.pyという名前のファイルとして保存します。
pythonプロジェクトのパスでPython postobject.py
コマンドを実行して、サンプルコードを実行し、パラメーターを設定します。
コマンドの例を次に示します。
python postobject.py -- bucket=examplebucket -- endpoin t=oss-cn-hangzhou.aliyuncs.com -- id=LTAI5t7h6SgiLSganP2m **** -- key=KZo149BD9GLPNiDIEmdQ7dyNKG **** -- out=post.html
次の表に、上記のコマンドのパラメーターを示します。
パラメーター | 説明 |
-- bucket | オブジェクトをアップロードするバケットの名前。 |
-- endpoint | バケットが配置されているリージョンのエンドポイント。 |
-- id | OSSへのアクセスに使用されるAlibaba CloudアカウントまたはRAMユーザーのAccessKey ID。 |
-- キー | OSSへのアクセスに使用されるAlibaba CloudアカウントまたはRAMユーザーのAccessKeyシークレット。 |
-アウト | 出力ファイルの名前。 |
post.htmlを開き、アップロードするオブジェクトを選択し、[アップロード] をクリックします。
オブジェクトがアップロードされると、クライアントはサンプルコードで指定されたページに自動的にリダイレクトされます。
OSS APIの使用
ビジネスで高度なカスタマイズが必要な場合は、RESTful APIを直接呼び出すことができます。 APIを直接呼び出すには、コードに署名計算を含める必要があります。 詳細は、「PostObject」をご参照ください。