base64 データの PUT リクエストを使用して Google クラウド ストレージにアップロードすると、画像 (PNG) がブラウザーに表示されず、エラーが含まれていると表示されます (FF で表示する場合)。
画像ファイルをテキストエディタで開くとbase64データ「data:image/png;base64,iVBORw...」が表示されるので、バイナリに変換されません。
バイナリをアップロードするつもりですか、またはこれを HTTP 本文の base64 で動作させる方法はありますか?
基本的なコード サンプル。
<?php
$theDate = 日付(DATE_RFC822);
$emailID = "********.gserviceaccount.com";
$priv_key = file_get_contents("*******-privatekey.p12");
function signedURL( $filename, $bucket, $method = 'PUT' ) {
グローバル $emailID;
グローバル $priv_key;
$signature = "";
$期間 = 60;
$証明書 = 配列();
if (!openssl_pkcs12_read($priv_key, $certs, 'notasecret')) { echo "p12 ファイルを解析できません。OpenSSL エラー: " . openssl_error_string(); 出口(); }
$expires = time() + $duration;
$to_sign = ( $method . "\n\nimage/png; charset=UTF-8\n" . $expires . "\nx-goog-acl:public-read\n" . "/" . $bucket . " /" . $ファイル名 );
$RSAPrivateKey = openssl_pkey_get_private($certs["pkey"]);
if (!openssl_sign( $to_sign, $signature, $RSAPrivateKey, 'sha256' ))
{
error_log( 'openssl_sign に失敗しました!' );
$signature = '失敗';
} そうしないと {
$signature = urlencode( base64_encode( $signature ) );
}
return ('http://' . $bucket . '/' . $filename . '?GoogleAccessId=' . $emailID . '&Expires=' . $expires . '&Signature=' . $signature);
openssl_free_key($RSAPrivateKey);
}
$UploadURL = signedURL('test.png', 'mybucket.mydomain.net', 'PUT');
// $UploadURL をエコーします。
?>
<スクリプト>
var base64img = "data:image/png;base64,iVB...";//snipped
var xhr = 新しい XMLHttpRequest();
xhr.open("PUT", "<?php echo $UploadURL ?>");
xhr.setRequestHeader("コンテンツタイプ", "画像/png");
xhr.setRequestHeader("x-goog-acl", "public-read"); //ファイルにパブリック読み取りを設定しようとします
xhr.setRequestHeader("Content-Length", base64img.length); // Chrome がエラーをスローします
xhr.send( base64img );
</script>
私がオンラインで読んだことに基づいてそれは可能だと感じていますが、それを機能させるために何が欠けているかを示すために PUT で行われる方法を正確に示す例は見つかりません.