サードパーティのユーザーは、署名付きURLを使用して、セキュリティ資格情報や承認なしでローカルファイルをアップロードできます。 次に、アップロードされたファイルをオブジェクトとして特定のバケットに保存します。
手順
署名付きURLを生成します。
次のサンプルコードは、一般的なプログラミング言語でOSS SDKを使用して署名付きURLを生成する方法の例を示しています。 他のプログラミング言語のOSS SDKを使用して署名付きURLを生成する方法の詳細については、「概要」をご参照ください。
Java
com.aliyun.oss.*; impor t com.aliyun.oss.com mon.auth.*; com.aliyun.oss.int ernal.OSSHeadersをインポートします。com.aliyun.oss.mo del.GeneratePresignedUrlRequestをインポートします。com.aliyun.oss.mo del.StorageClassをインポートします。org.apache.http.HttpEntityをインポートします。org.apache.http.client.methods.CloseableHttpResponseをインポートします。org.apache.http.client.methods.HttpPutをインポートします。org.apache.http.entity.FileEntityをインポートします。org.apache.http.impl.client.CloseableHttpClientをインポートします。org.apache.http.impl.client.HttpClientsをインポートします。java.io.* をインポートします。impor t java.net.URL; java.util.* をインポートします。java.util.Dateをインポートします。public classデモ { public static void main(String[] args) Throwable { // この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // 環境変数からアクセス資格情報を取得します。 コードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Specify the bucket name. 例: examplebucket. String bucketName = "examplebucket"; // オブジェクトのフルパスを指定します。 例: exampleobject.txt。 フルパスにバケット名を含めることはできません。 文字列objectName = "exampleobject.txt"; // Create an OSSClient instance. OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); // リクエストヘッダーを指定します。 Map<String, String> headers = new HashMap<String, String>(); /* // オブジェクトのストレージクラスを指定します。 headers.put(OSSHeaders.STORAGE_CLASS, StorageClass.Standard.toString()); // ContentTypeを指定します。 headers.put(OSSHeaders.CONTENT_TYPE、"text/txt");* / // カスタムメタデータを指定します。 Map<String, String> userMetadata = new HashMap<String, String>(); /* userMetadata.put("key1","value1"); userMetadata.put("key2","value2");* / URL signedUrl = null; try { // 署名付きURLの有効期間を指定します。 単位:ミリ秒。 この例では、有効期間は1時間に設定されています。 日付の有効期限=新しい日付 (new Date().getTime() + 3600 * 1000L); // Generate the signed URL. GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT); // 有効期限を指定します。 request.setExpiration(expiration); // リクエストにヘッダーを追加します。 request.setHeaders (ヘッダー); // カスタムメタデータを追加します。 request.setUserMetadata(userMetadata); // HTTP PUTリクエストを許可する署名付きURLを生成します。 signedUrl = ossClient.generatePresignedUrl (要求); // 署名されたURLを表示します。 System.out.println("signed url for putObject: " + signedUrl); } catch (Exception e) { System.out.println("Caught an OSSException, which means your request made it to OSS, " + "しかし、何らかの理由でエラー応答で拒否されました。"); System.out.println("エラーメッセージ:" + oe.getErrorMessage()); System.out.println("エラーコード:" + oe.getErrorCode()); System.out.println("リクエストID:" + oe.getRequestId()); System.out.println("ホストID:" + oe.getHostId()); } catch (ClientException e) { System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + 「ネットワークにアクセスできないなど」; System.out.println("エラーメッセージ:" + ce.getMessage()); } } }
PHP
<?php if (is_file(__DIR__) 。 '/../autoload.php')) { require_once __DIR__ . '/../autoload.php'; } if (is_file(__DIR__) 。 '/../vendor/autoload.php')) { require_once __DIR__ . '/../vendor/autoload.php'; } OSS\Credentials\EnvironmentVariableCredentialsProviderを使用します。OSS\OssClientを使用します。OSS\Core\OssExceptionを使用します。OSS\Http\RequestCoreを使用します。OSS\Http\ResponseCoreを使用します。// サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 $provider = new EnvironmentVariableCredentialsProvider(); // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 $end point = "https://oss-cn-hangzhou.aliyuncs.com"; // バケット名を指定します。 $bucket= "examplebucket"; // オブジェクトのフルパスを指定します。 オブジェクトのフルパスにバケット名を含めないでください。 $object = "exampleobject.txt"; // 署名付きURLの有効期間を3600に設定します。 単位は秒です。 $timeout = 3600; try { $config=配列 ( "provider" => $provider、 "endpoint" => $end ポイント、 ); $ossClient = new OssClient($config); // Generate the signed URL. $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "PUT"); } catch (OssException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage()) 。 "\n"); 戻ります。} print(__FUNCTION__) 。 ": signedUrl: " 。 $signedUrl。 "\n");
Node.js
const OSS = require("ali-oss"); const { default: axios } = require("axios"); const fs = require("fs"); const client = new OSS({ // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。 リージョン: "oss-cn-hangzhou" 、 // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 accessKeyId: process.env.OSS_ACCESS_KEY_ID、 accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、 // バケットの名前を指定します。 bucket: "examplebucket" 、}); // ローカルファイルのアップロードに使用される署名付きURLを生成します。 const url = client.signatureUrl("exampleobject.txt", { メソッド: "PUT" 、 "Content-Type": "application/x-www-form-urlencoded" 、}); console.log(url);
Python
# -*-コーディング: utf-8 -*- oss2のインポート oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート インポートリクエスト # 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider()) # バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 # バケットの名前を指定します。 例: examplebucket. bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket') # オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 object_name = 'exampleobject.txt' # ヘッダーを指定します。 headers = dict() # コンテンツタイプを指定します。 ヘッダー ['Content-Type'] = 'text/txt' # オブジェクトのストレージクラスを指定します。 headers["x-oss-storage-class"] = "Standard" # ローカルファイルのアップロードに使用される署名付きURLを生成します。 署名付きURLの有効期間を60秒に設定します。 # デフォルトでは、署名付きURLが生成されると、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別します。 したがって、署名付きURLを直接使用することはできません。 # slash_safeパラメーターをTrueに設定します。 このように、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別しません。 次に、生成された署名付きURLを使用してオブジェクトをアップロードできます。 url = bucket.sign_url('PUT', object_name, 60, slash_safe=True, headers=headers) print ('The signed URL:', url)
Browser.js
// 一時的なアクセス資格情報を生成します。 const OSS = require("ali-oss"); const STS = require("ali-oss").STS; // const cors = require("cors"); const stsClient = new STS({ // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 accessKeyId: process.env.OSS_ACCESS_KEY_ID、 accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、}); // バケットの名前を指定します。 例: examplebucket. const bucket = "examplebucket"; // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。 const region = "yourRegion"; // RAMロールのARNを指定します。 const roleArn = "acs:ram::137918634953 ****:role/ossram"; const getSts = () => { stsClient . assumeRole (assumeRole) roleArn, `{ "Statement": [ { "Effect": "Allow", "Action": "*", "Resource": [ "acs:oss:*:*:examplebucket/*" ] } ] }`, 3000 // セキュリティトークンの有効期限を指定します。 ) . then((r) => { console.log("send:", r.credentials); const { SecurityToken, AccessKeyId, AccessKeySecret } = r.credentials; const client = new OSS({ バケット、 region, accessKeyId: AccessKeyId、 accessKeySecret: AccessKeySecret、 stsToken: SecurityToken、 リフレッシュSTokenInterval: 9000、 }); // バケットにアップロードするオブジェクトの名前を指定します。 const url = client.asyncSignatureUrl("example.txt", { 有効期限: 3600、 メソッド: "PUT" 、 // Content-Typeを指定します。 "Content-Type": "text/plain;charset=UTF-8" 、 }); console.log("url:" 、url); // client.put("example.txt", Buffer.from("body")).then((res) => { // console.log("res", res.url); // }); }); }; getSts();
アンドロイド
// バケットの名前を指定します。 例: examplebucket. String bucketName = "examplebucket"; // ソースオブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampleobject.txt。 String objectKey = "exampleobject.txt"; // Content-Typeを指定します。 String contentType = "application/octet-stream"; 文字列url = null; try { // オブジェクトのアップロードに使用する署名付きURLを生成します。 GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey); // 署名付きURLの有効期間を30分に設定します。 request.setExpiration(30*60); request.setContentType(contentType); request.setMethod(HttpMethod.PUT); url = mOss.presignConstrainedObjectURL (リクエスト); Log.d("url" 、url); } catch (ClientException e) { e.printStackTrace(); }
行く
パッケージメイン import (import (import) "fmt" "os" 「github.com/aliyun/aliyun-oss-go-sdk/oss」 ) func HandleError (エラーエラー) { fmt.Println("Error:", err) os.Exit(-1) } func main() { // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } // OSSClientインスタンスを作成します。 // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。 client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider)) if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } // バケットの名前を指定します。 例: examplebucket. bucketName := "examplebucket" // オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。 objectName := "exampledir/exampleobject.txt" bucket, err := client.Bucket(bucketName) if err! =nil { HandleError(err) } // ローカルファイルのアップロードに使用される署名付きURLを生成します。 署名付きURLの有効期間を60秒に設定します。 signedURL, err := bucket.SignURL(objectName, oss.HTTPPut, 60) if err! =nil { HandleError(err) } // カスタムパラメーターを含む署名付きURLを使用してブラウザーからオブジェクトにアクセスするには、URLに含まれるContentType値がリクエストで指定されたContentType値と同じであることを確認します。 options := []oss.Option{ oss.Meta("myprop", "mypropval"), oss.ContentType("text/plain") 、 } signedURL, err = bucket.SignURL(objectName, oss.HTTPPut, 60, options...) if err! =nil { HandleError(err) } fmt.Printf("Sign Url:% s\n", signedURL) }
iOS
// バケットの名前を指定します。 NSString * bucketName = @ "examplebucket"; // オブジェクトの名前を指定します。 NSString * objectKey = @ "exampleobject.txt"; NSURL * file = [NSURL fileURLWithPath:@ "<filePath>"]; NSString * contentType = [OSSUtil detemineMimeTypeForFilePath:file.absoluteString uploadName:objectKey]; __ブロックNSString * urlString; // オブジェクトをアップロードするための有効期間を指定した署名付きURLを生成します。 この例では、URLの有効期間は30分です。 OSSTask * task = [client presignConstrainURLWithBucketName:bucketName withObjectKey:objectKey httpMethod:@ "PUT" withExpirationInterval:30*60 withParameters :@{} contentType:contentType contentMd5:nil]; [task continueWithBlock:^ id _Nullable(OSSTask * _Nonnull task) { if (task.error) { NSLog(@ "presign error: % @" 、task.error); } else { urlString = task.result; NSLog(@ "url: % @", urlString); } nilを返します。}];
署名付きURLを使用してローカルファイルをアップロードします。
次のサンプルコードは、一般的なプログラミング言語のOSS SDKを使用して、署名付きURLを使用してローカルファイルをアップロードする方法の例を示しています。 他のプログラミング言語のOSS SDKを使用して、署名付きURLを使用してローカルファイルをアップロードする方法の詳細については、「概要」をご参照ください。
Java
org.apache.http.HttpEntityをインポートします。org.apache.http.client.methods.CloseableHttpResponseをインポートします。org.apache.http.client.methods.HttpPutをインポートします。org.apache.http.entity.FileEntityをインポートします。org.apache.http.impl.client.CloseableHttpClientをインポートします。org.apache.http.impl.client.HttpClientsをインポートします。java.io.* をインポートします。java.util.* をインポートします。public classデモ { public static void main(String[] args) Throwable { // アップロードするローカルファイルのフルパスを指定します。 デフォルトでは、ローカルファイルのパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからファイルがアップロードされます。 文字列pathName = "D :\\ examplefile.txt"; // ステップ1で生成された署名付きURLを入力します。 String signedUrl = "yourSignedUrl"; Map<String, String> headers = new HashMap<String, String>(); Map<String, String> userMetadata = new HashMap<String, String>(); // 署名付きURLを使用して、サードパーティのユーザーにローカルファイルのアップロードを許可します。 この例では、HttpClientsが使用されます。 putObjectWithHttp(signedUrl, pathName, headers, userMetadata); } public static void putObjectWithHttp(String signedUrl、String pathName、Map<String、String> ヘッダー、Map<String、String> userMetadata) はIOException {をスローします CloseableHttpClient httpClient = null; CloseableHttpResponse応答=null; try { HttpPut put = new HttpPut(signedUrl); HttpEntityエンティティ=new FileEntity(new File(pathName)); put.setEntity (エンティティ); // 署名付きURLの生成時にユーザーメタデータやストレージクラスなどのヘッダーを設定する場合、署名付きURLを使用してローカルファイルをアップロードするときに、これらのヘッダーをサーバーに送信する必要があります。 署名のヘッダーがサーバーに送信されたヘッダーと一致しない場合、署名エラーが報告されます。 for(Map.Entryヘッダー: headers.entrySet()){ put.addHeader(header.getKey().toString(),header.getValue().toString()); } for(Map.Entry meta: userMetadata.entrySet()){ // userMetaが使用されている場合、x-oss-metaプレフィックスがuserMetaに追加されます。 他のメソッドを使用して署名付きURLを生成する場合、x-oss-meta-プレフィックスもuserMetaに追加されます。 put.addHeader("x-oss-meta-" + meta.getKey().toString(), meta.getValue().toString()); } httpClient = HttpClients.createDefault(); 応答=httpClient.exeかわいい (置く); System.out.println("Upload status code:" + response.getStatusLine().getStatusCode()); if(response.getStatusLine().getStatusCode() == 200){ System.out.println("ネットワークライブラリを使用してオブジェクトを正常にアップロードする"); } System.out.println(response.toString()); } catch (例外e){ e.printStackTrace(); } 最後に{ response.close(); httpClient.close(); } } }
PHP
<?php if (is_file(__DIR__) 。 '/../autoload.php')) { require_once __DIR__ . '/../autoload.php'; } if (is_file(__DIR__) 。 '/../vendor/autoload.php')) { require_once __DIR__ . '/../vendor/autoload.php'; } OSS\Http\RequestCoreを使用します。OSS\Http\ResponseCoreを使用します。// ステップ1で生成された署名付きURLを入力します。 $signedUrl = 'yourSignedUrl'; $content = "Hello OSS"; $request = new RequestCore($signedUrl); // 署名付きURLを使用して、ローカルファイルをアップロードします。 $request->set_method('PUT'); $request->add_header('Content-Type', ''); $request->add_header('Content-Length' 、strlen($content)); $request->set_body($content); $request->send_request(); $res = new ResponseCore($request->get_response_header() 、 $request->get_response_body(), $request->get_response_code(); if ($res->isOK()) { print(__FUNCTION__ . ": OK" 。 "\n"); } else { print(__FUNCTION__ . ": FAILED" 。 "\n"); };
Node.js
const OSS = require("ali-oss"); const { default: axios } = require("axios"); const fs = require("fs"); // ステップ1で生成された署名付きURLを入力します。 const url = "yourSignedUrl"; // ローカルファイルのフルパスを指定します。 constファイル=fs.readFileSync("D :\\ examplefile.txt"); // 署名付きURLを使用して、ローカルファイルをアップロードします。 axios({ url, メソッド: "PUT" 、 data: ファイル、}) . then((r) => console.log(r)) . catch((e) => console.log(e));
Python
# -*-コーディング: utf-8 -*- oss2のインポート インポートリクエスト # ステップ1で生成された署名付きURLを入力します。 url = 'yourSignedUrl' # ヘッダーを指定します。 headers = dict() # コンテンツタイプを指定します。 ヘッダー ['Content-Type'] = 'text/txt' # オブジェクトのストレージクラスを指定します。 headers["x-oss-storage-class"] = "Standard" # 署名付きURLを使用してローカルファイルをアップロードします。 # ローカルファイルのフルパスを指定します。 例: D :\\ examplefile.txt。 requests.put(url, data=open('D :\\ examplefile.txt ', 'rb').read(), headers=headers)
Browser.js
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title> ドキュメント </title> </head> <body> <script src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"></script> <script> // ステップ1で生成された署名付きURLを入力します。 const url = "yourSignatureUrl"; var xhr = new XMLHttpRequest(); xhr.open("PUT" 、url、true); xhr.onload = function () { // さらなる操作のコードを追加します。 }; // xhr.send(null); xhr.send("string"); // xhr.send (新しいBlob()); // xhr.send (新しいInt8Array()); // xhr.send({ form: 'data' }); // xhr.send (ドキュメント); </script> </body> </html>
アンドロイド
// 生成された署名付きURLを入力します。 文字列url = ""; // ローカルファイルのフルパスを指定します。 String localFile = "/storage/emulated/0/oss/examplefile"; // Content-Typeを指定します。 String contentType = "application/octet-stream"; // 署名付きURLを使用してオブジェクトをアップロードします。 OkHttpClient client = new OkHttpClient(); Request putRequest = new Request.Builder() . url(url) . put(RequestBody.create(MediaType.parse(contentType), new File(localFile))) . build(); client.newCall(putRequest).enqueue(new Callback() { @オーバーライド public void onFailure (コールコール, IOException e) { e.printStackTrace(); } @オーバーライド public void onResponse (コールコール、レスポンスレスポンス) throws IOException { Log.d("response", response.body().string()); } });
行く
パッケージメイン import (import (import) "fmt" "os" "strings" 「github.com/aliyun/aliyun-oss-go-sdk/oss」 ) func main() { client, err := oss.New("oss-cn-hangzhou.aliyuncs.com", ", " ") if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } // バケットの名前を指定します。 例: examplebucket. bucketName := "examplebucket" bucket, err := client.Bucket(bucketName) if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } // ステップ1で生成された署名付きURLを入力します。 signedURL := "yourSignedUrl" var val = "Go with Alibaba Cloud" err = bucket.PutObjectWithURL(signedURL, strings.NewReader(val)) if err! =nil { fmt.Println("Error:", err) os.Exit(-1) } }
iOS
// 署名付きURLを使用してオブジェクトをアップロードします。 NSURL * url = [NSURL URLWithString:urlString]; NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @ "PUT"; request.allHTTPHeaderFields = @{OSSHttpHeaderContentType: contentType}; NSURLSession * session = [NSURLSession sharedSession]; NSURLSessionTask * sessionTask = [session uploadTaskWithRequest: リクエスト fromFile: ファイル completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error) { NSLog(@ "アップロードエラー: % @" 、エラー); 戻る; } else if (((NSHTTPURLResponse *)response).statusCode == 203 | | ((NSHTTPURLResponse *) レスポンス) 。statusCode >= 300) { NSString * body = [[NSString alloc] initWithData: データエンコード: NSUTF8StringEncoding]; NSLog(@ "アップロードエラー: % @", body); return; } NSLog(@ "アップロード成功"); }]; [sessionTask resume];