Я использую функцию Google Cloud Storages Signed URLs с приведенным ниже кодом. Имена файлов без пробелов работают нормально, но те, у кого есть пробелы, дают эту ошибку:
The request signature we calculated does not match the signature you provided.
Я передаю имя файла через ajax в код ниже, который затем возвращает ссылку на пользователя. Я пробовал сочетание rawurlencode, urlencode и urldecode, но, похоже, не работает.
заранее спасибо
$bucket = 'savoy_storage'; if (isset($_GET['file'])) { $file = urldecode($_GET['file']); $link = storageURL( $bucket, $file); echo $link; } //https://groups.google.com/forum/#!topic/google-api-php-client/kvN-yoyzf_w function storageURL( $bucketName, $file) { $expiry = time() + 3600; $accessId = '1234@developer.gserviceaccount.com'; $stringPolicy = "GET\n\n\n".$expiry."\n/".$bucketName."/".$file; $fp = fopen('key.pem', 'r'); $priv_key = fread($fp, 8192); fclose($fp); $pkeyid = openssl_get_privatekey($priv_key,"password"); if (openssl_sign( $stringPolicy, $signature, $pkeyid, 'sha256' )) { $signature = urlencode( base64_encode( $signature ) ); return 'https://'.$bucketName.'.commondatastorage.googleapis.com/'.$file.'? GoogleAccessId='.$accessId.'&Expires='.$expiry.'&Signature='.$signature; } }
Если это помогает здесь – это возвращенный XML из ссылки:
<Error> <Code>SignatureDoesNotMatch</Code> <Message> The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method. </Message> <StringToSign> GET 1391312980 /savoy_storage/August%20promotions.xlsx </StringToSign> </Error>