NoSuchKey при получении подписанного URL-адреса объекта cloudstorage с пробелом в имени

Ниже приведен код приложения, использующий app_identity.sign_blob () для запроса подписанного URL-адреса. Этот код отлично работает, когда в имени файла GCS нет места. В именах объектов допускается пробел. Для тестирования я использовал SDK.

Я видел много вопросов по этой проблеме, но я не мог создать решение

Это ошибка или?

def sign_url(bucket_object, expires_after_seconds=6, bucket=default_bucket): method = 'GET' gcs_filename = urllib.quote('/%s/%s' % (bucket, bucket_object)) content_md5, content_type = None, None # expiration : number of seconds since epoch expiration_dt = datetime.utcnow() + timedelta(seconds=expires_after_seconds) expiration = int(time.mktime(expiration_dt.timetuple())) # Generate the string to sign. signature_string = '\n'.join([ method, content_md5 or '', content_type or '', str(expiration), gcs_filename]) signature_bytes = app_identity.sign_blob(signature_string)[1] # Set the right query parameters. we use a gae service account for the id query_params = {'GoogleAccessId': google_access_id, 'Expires': str(expiration), 'Signature': base64.b64encode(signature_bytes)} # Return the built URL. result = '{endpoint}{resource}? {querystring}'.format(endpoint=GCS_API_ACCESS_ENDPOINT, resource=gcs_filename, querystring=urllib.urlencode(query_params)) return result 

Обновить. Ответ, когда я использую подписанный URL:

 <Error> <Code>NoSuchKey</Code> <Message>The specified key does not exist.</Message> </Error> 

Проблема решена.

Я не знаю почему. Я ничего не изменил. Вы можете попробовать приложение GAE, используя приведенный ниже код и эту ссылку:

 https://voscausa-gae.appspot.com/download_signed?bucket_object=download/test signed1 .txt 

Код находится здесь: appengine-gcs-signed-url

Вы также можете использовать подписанный URL-адрес с политическим документом для прямой отправки в GCS.
Код: https://github.com/voscausa/appengine-gcs-upload