フォームアップロードでは、OSS の PostObject API を使用して、最大サイズが 5 GB のオブジェクトをアップロードできます。

PostObject API の詳細は、「PostObject」をご参照ください。

シナリオ

この方法は、HTML Web ページ上でオブジェクトをアップロードする場合に使用します。 典型的なシナリオは、Web アプリケーションです。 たとえば、次の表では、求人検索 Web サイトでのフォームアップロードプロセスと他のアップロードプロセスを比較しています。

その他のアップロード方法 フォームアップロード
アクセスプロセス
  1. Web ユーザーが履歴書のアップロードリクエストを送信します。
  2. Web サーバーは履歴書アップロードページにレスポンスします。
  3. 履歴書が Web サーバーにアップロードされます。
  4. Web サーバーは履歴書を OSS にアップロードします。
  1. Web ユーザーが履歴書のアップロードリクエストを送信します。
  2. Web サーバーは履歴書アップロードページにレスポンスします。
  3. 履歴書が OSS にアップロードされます。
  • データは Web サーバーによって転送されず、 OSS に直接アップロードされるため、フォームアップロードプロセスの方が簡単です。
  • 他のアップロードプロセスでは、オブジェクトは最初に Web サーバーにアップロードされます。 多数のオブジェクトをアップロードする場合、Web サーバーをスケールアウトする必要があります。 フォームアップロードプロセスでは、オブジェクトはクライアントから OSS に直接アップロードされます。 多数のオブジェクトをアップロードする場合、OSS にアップロードの負荷がかかりますが、サービス品質を確保します。

SDK デモ

詳細は、「Java SDK」をご参照ください。

アップロードの制限

  • サイズ:このモードでは、オブジェクトの最大サイズは 5 GB です。
  • 命名規則:
    • オブジェクト名は UTF-8 でエンコードされている要があります。
    • オブジェクト名は 1 バイト以上 1,023 バイト以下にする必要があります。
    • オブジェクト名を、スラッシュ (/) またはバックスラッシュ (\) で始めることはできません。

プロセス分析

  1. POST ポリシーを作成します。

    POST リクエストのポリシーフォームフィールドは、有効なリクエストかどうかの検証に使用されます。 たとえば、ポリシーにはアップロードするオブジェクトのサイズと名前、クライアントのジャンプ先 URL、およびアップロードが成功した後にクライアントが受信する HTTP ステータスコードを指定できます。 詳細は、「Post ポリシー」をご参照ください。

    たとえば、次のポリシーでは、Web ユーザーによるデータのアップロード期限を 2115-01-27T10:56:19Z、アップロードするオブジェクトの最大サイズを 104,857,600 バイトに設定します。 テスト用に長めの有効期間が設定されていますが、実用では推奨しません。
    This example uses the Python code. The policy is a JSON-formatted string.
     policy="{\"expiration\":\"2115-01-27T10:56:19Z\",\"conditions\":[[\"content-length-range\", 0, 104857600]]}"
  2. Base64 でポリシー文字列をエンコードします。
  3. OSS の AccessKey Secret を使用して、Base64 でエンコードされたポリシーに署名を追加します。
  4. アップロード用の HTML ページを作成します。
  5. HTML ページを開き、アップロードするオブジェクトを選択します。

次の例は、完全な Python サンプルコードを示します。

#coding = utf-8
import md5
import hashlib
import base64
import hmac
from optparse import OptionParser
def convert_base64(input):
    return base64.b64encode(input)
def get_sign_policy(key, policy):
    return base64.b64encode(hmac.new(key, policy, hashlib.sha1).digest())
def get_form(bucket, endpoint, access_key_id, access_key_secret, out):
    #1 Create a POST policy.
    policy="{\"expiration\":\"2115-01-27T10:56:19Z\",\"conditions\":[[\"content-length-range\", 0, 1048576]]}"
    print("policy: %s" % policy)
    #2 Use Base64 to encode the policy string.
    base64policy = convert_base64(policy)
    print("base64_encode_policy: %s" % base64policy)
    #3 Use the AccessKey Secret of OSS to add a signature to the encoded policy.
    signature = get_sign_policy(access_key_secret, base64policy)
    #4 Create an HTML page for upload.
    form = '''
    <html> 
        <meta http-equiv=content-type content="text/html; charset=UTF-8"> 
        <head><title>OSS form upload (through the PostObject API)</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="http://oss.aliyun.com"> 
                <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)
    f.close()
    print("form is saved into %s" % out)
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 --endpoint=oss-cn-hangzhou.aliyuncs.com --id=your-access-key-id --key=your-access-key-secret --out=out-put-form-name" % __file__

次のコード例を post_object.py として保存し、python post_object.py を実行します。

Usage:
python post_object.py --bucket=Your bucket name --endpoint=Bucket endpoint --id=Your AccessKey ID --key=Your AccessKey Secret --out=Output object name
Example:
python post_object.py --bucket=oss-sample --endpoint=oss-cn-hangzhou.aliyuncs.com --id=tphpxp --key=ZQNJzf4QJRkrH4 --out=post.html
  • 作成されたフォーム内の success_action_redirect value=http://oss.aliyun.com は、アップロードが成功した後に表示される Web ページを示します。 独自の Web ページに置き換えることができます。
  • 作成されたフォーム内の success_action_status value=201 は、アップロードが成功した後に HTTP ステータスコード 201 が返されることを示します。 別の HTTP ステータスコードに変更できます。
  • 生成された HTML ページがpost.html の場合、post.html を開き、アップロードするオブジェクトを選択します。 この例では、アップロードが成功した後、OSS プロダクトページ (http://oss.aliyun.com) が表示されます。

アップロードのセキュリティと認証

許可されていないサードパーティのユーザーがバケットにデータをアップロードできないようにするため、バケットレベルおよびオブジェクトレベルのアクセス制御が提供されています。 詳細は、「アクセス制御」をご参照ください。

サードパーティのユーザーにオブジェクトのアップロードを許可するため、アカウント認証も提供されています。 詳細は、「認証済みのサードバーティによるアップロード」をご参照ください。