使用带有 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"); 函数签名URL($文件名,$bucket,$method = 'PUT'){ 全局 $emailID; 全局 $priv_key; $签名=“”; $持续时间 = 60; $certs = 数组(); 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...";//截图 var xhr = new XMLHttpRequest(); xhr.open("PUT", "<?php echo $UploadURL ?>"); xhr.setRequestHeader("内容类型", "图片/png"); xhr.setRequestHeader("x-goog-acl", "public-read"); //尝试对文件设置公共读取 xhr.setRequestHeader("内容长度", base64img.length); // Chrome 抛出错误 xhr.send(base64img); </脚本>
根据我在网上阅读的内容,我觉得这是可能的,但我找不到任何示例准确显示 PUT 的完成方式,以表明缺少什么使其工作。