HTMLフォームを使用してPOST経由でGCEにファイルをアップロードしようとしましたが、これまでのところ次のエラーメッセージが表示され続けています。
計算したリクエストの署名が、提供された署名と一致しません。Google 秘密鍵と署名方法を確認してください。
gcs.php というファイルにあるサンプル コードを次に示します。
<?php
$bucketName = “BUCKET_NAME";
$accessId = “ACCESS_ID";
function generateGcsSignature($bucketName, $filePath, $params=array()){
if($params['ttl'] < 300) {
$params['ttl'] = 300; // 5 mins
}
$expiry = time() + $params['ttl'];
$valid_methods = array("PUT","GET", "POST");
$method = "";
if(!isset($params["method"]) || !in_array($params['method'], $valid_methods))
$method = "GET";
else
$method = $params["method"];
$parts = array($params['method'], "", "", $expiry, "/$bucketName/$filePath");
$stringPolicy = implode("\n", $parts);
$fp = fopen("../gcs-key.pem", "r");
$priv_key = fread($fp, 8192);
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key, "");
$signSuccess = openssl_sign($stringPolicy, $signature, $pkeyid, 'sha256' );
$openssl_error = openssl_error_string();
if ($signSuccess) {
$signature = urlencode( base64_encode( $signature ) );
global $accessId;
return $signature;
}
}
function generatePolicy(){
$policy = '
{"expiration": "'.date("c", time()+300).'",
"conditions": [
["starts-with", "key", "" ],
{"acl": "bucket-owner-read" },
{"bucket": "BUCKET_NAME"},
{"success_action_redirect": "http://www.example.com/success_notification.html" },
["eq", "Content-Type", "image/jpeg" ],
["content-length-range", 0, 1000000]
]
}';
$policy = base64_encode(trim($policy));
$fp = fopen("../gcs-key.pem", "r");
$priv_key = fread($fp, 8192);
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key, "");
$signSuccess = openssl_sign($policy, $signature, $pkeyid, 'sha256' );
$openssl_error = openssl_error_string();
if ($signSuccess) {
$signature = urlencode( base64_encode( $signature ) );
global $accessId;
return $signature;
}
}
$signature = generateGcsSignature($bucketName, $key, array("ttl" => "300", "method" => "POST"));
$policy = generatePolicy();
?>
<form action="http://<?=$bucketName?>.storage.googleapis.com" method="post" enctype="multipart/form-data">
<input type="text" name="key" value="asdfasdf.jpg">
<input type="hidden" name="bucket" value="<?=$bucketName?>">
<input type="hidden" name="Content-Type" value="image/jpeg">
<input type="hidden" name="GoogleAccessId" value="<?=$accessId?>">
<input type="hidden" name="acl" value="bucket-owner-read">
<input type="hidden" name="success_action_redirect" value="http://www.example.com/success_notification.html">
<input type="hidden" name="policy" value="<?=$policy?>"/>
<input type="hidden" name="signature" value="<?=$signature?>">
<input name="file" type="file">
<input type="submit" value="Upload">
</form>
コードで BUCKET_NAME と ACCESS_ID が適切な値に設定されていることに注意してください。指定したバケット内のファイルに対して GET を実行できたので、これを確認できます。
私はこの問題の解決策を探していましたが、これまでのところうまくいきませんでした. 私が得ることができる助けをいただければ幸いです!