フォームアップロードは、OSS API の PostObject 関数を使用してオブジェクトをアップロードすることを指します。5 GB を超えるオブジェクトをアップロードすることはできません。この関数は、HTML ウェブページより、オブジェクトをアップロードする際に使用します。Web アプリケーションに適用されることを想定しています。

ここでは、求職サイトを例として取り上げます。フォームアップロードを使用した場合と使用しない場合の処理を比較すると、次のようになります。

フォームアップロードを使用しない場合の処理 フォームアップロードを使用した場合の処理
  1. Web ユーザーが履歴書をアップロードします。
  2. Web サーバーは、アップロードページに応答します。
  3. サーバーに履歴書がアップロードされます。
  4. サーバーによって OSS に履歴書がアップロードされます。
  1. Web ユーザーが履歴書をアップロードします。
  2. Web サーバーは、アップロードページに応答します。
  3. OSS に履歴書がアップロードされます。

アップロード制限

  • 各オブジェクトサイズの上限は 5 GB です。
  • オブジェクトの命名規則は次のとおりです。
    • オブジェクト名は UTF-8 でエンコードされている必要があります。
    • オブジェクト名は、1 バイト以上 1,023 バイト以下である必要があります。
    • オブジェクト名の先頭にバックスラッシュ (\) およびスラッシュ (/) は使用できません。

フォームアップロードの利点

フォームアップロードを使用しない場合は、まず Web サーバーにファイルがアップロードされます。ファイルは、Web サーバーによって OSS に転送されます。大容量ファイルをアップロードする場合、Web サーバーに負荷がかかり、拡張の必要も出てきます。フォームアップロードでは、クライアントから直接 OSS にファイルがアップロードされます。Web サーバーによる転送はありません。OSS がアップロードリクエストに対する一連の処理を実行するため、Web サービスの品質を確保することができます。

セキュリティと認証

権限のないサードパーティによってバケットにオブジェクトがアップロードされることがないよう、OSS はバケットおよびオブジェクトに対するアクセスを制御できます。

サードパーティによるアップロードを許可するには、PostObject インターフェイスを使用します。詳細については、PostObject をご参照ください。.

フォームアップロードの手順

  1. Post リクエストのポリシーを作成します。

    Post リクエストのポリシーフィールドは、リクエストの有効性を確認するために使用されます。たとえば、ポリシーにはアップロードするオブジェクトのサイズや名前、クライアントに渡すリダイレクト URL、正常にアップロードした場合にクライアントに返すステータスコードを指定できます。 詳細については、Post Policy をご参照ください。

    次のポリシー例では、Web サイトユーザーによるアップロードの期限を「2115-01-27T10:56:19Z」に指定しています (期限はテストのため、長めに設定されていますが、実際には、期限を短く設定することを推奨します)。なお、ファイルサイズの上限は 104857600 バイトに指定されています。
    1. この例では、Python コードを使用しており、ポリシーの文字列は JSON 形式です。 policy=”{\”expiration\”:\”2115-01-27T10:56:19Z\”,\”conditions\”:[[\”content-length-range\”, 0, 104857600]]}”
  2. Base64 でポリシー文字列をエンコードします。
  3. Base64 でエンコードされたポリシーに OSS AccessKeySecret で署名します。
  4. アップロード用の HTML ページを作成します。
  5. HTML ページを開き、アップロードするファイルを選択します。

Python の完全なコード例は次のとおりです。

  1. #coding=utf8import md5import hashlibimport base64import hmacfrom optparse import OptionParserdef 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. Post ポリシーを作成します。 policy=”{\”expiration\”:\”2115-01-27T10:56:19Z\”,\”conditions\”:[[\”content-length-range\”, 0, 1048576]]}” print(“policy: %s” % policy) #2. ポリシー文字列を Base64 でエンコードします。 base64policy = convert_base64(policy) print(“base64_encode_policy: %s” % base64policy) #3. OSS AccessKeySecret で、Base64 でエンコードされたポリシーに署名します。 signature = get_sign_policy(access_key_secret, base64policy) #4. アップロード用の HTML ページを作成します。 form = ‘’’ <html> <meta http-equiv=content-type content=”text/html; charset=UTF-8”> <head><title>OSS form upload (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://jp.alibabacloud.com/product/oss/“> <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」を実行します。

  1. 使用方法:python post_object.py bucket=バケット endpoint=バケットの OSS ドメイン名 id=AccessKeyId key=AccessKeySecret out=出力ファイルの名前例: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は、正常にアップロードが完了した際のリダイレクト先の URL を指定しています。リダイレクト先の URL は、ご利用環境に合わせて置き換えます。
  • 作成したフォーム内のsuccess_action_status value=201は、正常にアップロードが完了した場合、ステータスコード 201 を返すよう指定しています。値は、ご利用環境に合わせて適宜置き換えます。
  • HTML ファイルに post.html を指定した場合、post.html を開いてアップロードするファイルを選択します。例では、正常にアップロードが完了すると OSS のホームページにリダイレクトされます。

関数の参照先

ベストプラクティス