当前位置: 首页 > 知识库问答 >
问题:

谷歌云存储放不存为二进制

王锐
2023-03-14

当使用带有base64数据的PUT请求上传到Google cloud storage时,图像(PNG)不会在浏览器中显示,并表示它包含错误(在FF中查看时)。


    <?php

    $theDate    = Date(DATE_RFC822);
    $emailID    = "*******.gserviceaccount.com";
    $priv_key   = file_get_contents("*******-privatekey.p12");

    function signedURL( $filename, $bucket, $method = 'PUT' ) {
      global $emailID;
      global $priv_key;

       $signature  = "";
       $duration   = 60;
       $certs      = array();
          if (!openssl_pkcs12_read($priv_key, $certs, 'notasecret')) { echo "Unable to parse the p12 file. OpenSSL error: " . openssl_error_string(); exit(); }

        $expires = time() + $duration;
        $to_sign = ( $method . "\n\nimage/png; charset=UTF-8\n" . $expires . "\nx-goog-acl:public-read\n" . "/" . $bucket . "/" . $filename ); 
        $RSAPrivateKey = openssl_pkey_get_private($certs["pkey"]);

      if (!openssl_sign( $to_sign, $signature, $RSAPrivateKey, 'sha256' ))
      {
        error_log( 'openssl_sign failed!' );
        $signature = 'failed';
      } else {
        $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');

    //echo $UploadURL;

    ?>

    <script>
    var base64img  = "data:image/png;base64,iVB...";//snipped
    var xhr        = new XMLHttpRequest();

    xhr.open("PUT", "<?php echo $UploadURL ?>");
    xhr.setRequestHeader("Content-type", "image/png");
    xhr.setRequestHeader("x-goog-acl", "public-read"); //try to set public read on file
    xhr.setRequestHeader("Content-Length", base64img.length); // Chrome throws error
    xhr.send( base64img );
    </script>

根据我在网上读到的东西,我觉得这是可能的,但我找不到任何例子来说明它是如何用PUT来完成的,以表明它工作时缺少什么。

共有1个答案

米浩穰
2023-03-14

您通常希望避免使用base64编码,除非您确实需要。在base64中编码会产生大小开销,而且在使用之前还需要解码,这实际上是CPU开销。本质上,您只希望b64在您使用的协议和传输无法处理二进制数据的情况下对某些内容进行编码。

因此,在您的例子中,我认为答案是避免base64,只上传原始字节。在一般情况下,如果您在将某些内容存储到云存储之前对其进行base64编码,那么您需要在任何将其提取出来的软件中计划解码步骤。

 类似资料:
  • 是否有任何标题问题或设备方面的问题。请帮忙。

  • 我有一个具有统一访问控制的Google云存储桶,我在权限中添加了“诱惑者”。它说该对象是公共的,但当我尝试打开链接时,仍会收到此消息:“匿名调用方没有storage.objects.get access to the Google Cloud storage object”错误代码为“401”。我希望任何用户都能够访问该链接。我该怎么做?提前谢谢! 向你问好本

  • 我建立Android应用程序链接到谷歌云存储。我想允许访问GCS到我的Android应用程序只。 谷歌提供三种安全连接地面军事系统的解决方案: Oauth 2.0(谷歌账户也是如此) 资料来源:https://developers.google.com/storage/docs/authentication?hl=FR 是否有其他通过地面军事系统安全连接的解决方案?我希望通过这种方式在地面军事系统

  • 我们一直在使用服务,在(AWS)中,我们意外删除了一个目录,因此我们认为它应该在中,但是经过查看,尽管处于打开状态,但它并不存在。

  • 我知道可以使用谷歌API视觉在网上找到类似的图片。我的目标是根据我的图像数据库找到类似的图像。我不想在网上看到类似的图片。 可能吗? 如果是,你能给我一些链接或建议吗? 谢谢

  • 我应该做什么才能成功上传图片?任何帮助都将不胜感激。 非常感谢。