0

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 で行われる方法を正確に示す例は見つかりません.

4

1 に答える 1

0

本当に必要でない限り、通常は base64 エンコーディングの使用を避けたいと考えています。base64 で何かをエンコードすると、サイズのオーバーヘッドが発生し、使用する前にデコードが必要になります。これは事実上 CPU オーバーヘッドです。基本的に、使用しているプロトコルとトランスポートがバイナリ データを処理できない場合にのみ、b64 でエンコードする必要があります。

したがって、あなたの場合、答えはbase64を避け、生のバイトをアップロードすることだと思います。一般的に、何かを Cloud Storage に保存する前に base64 エンコードを行う場合は、それを引き出すソフトウェアでのデコード手順を計画する必要があります。

于 2013-06-14T17:31:26.863 に答える