Я использую python3.6
Когда я пытаюсь загрузить файл с невидимыми символами ascii, у меня появляется ошибка из gcp.
import tempfile
from google.cloud import storage
client = storage.Client()
bucket = client.get_bucket('my-bucket')
blob = bucket.blob('test_ascii')
fd = tempfile.TemporaryFile('w+')
fd.write('\u0090')
fd.seek(0)
blob.upload_from_file(fd)
Я получаю следующее исключение
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/google/cloud/storage/blob.py", line 1085, in upload_from_file
client, file_obj, content_type, size, num_retries, predefined_acl
File "/usr/local/lib/python3.6/dist-packages/google/cloud/storage/blob.py", line 995, in _do_upload
client, stream, content_type, size, num_retries, predefined_acl
File "/usr/local/lib/python3.6/dist-packages/google/cloud/storage/blob.py", line 942, in _do_resumable_upload
response = upload.transmit_next_chunk(transport)
File "/usr/local/lib/python3.6/dist-packages/google/resumable_media/requests/upload.py", line 396, in transmit_next_chunk
self._process_response(result, len(payload))
File "/usr/local/lib/python3.6/dist-packages/google/resumable_media/_upload.py", line 574, in _process_response
self._get_status_code, callback=self._make_invalid)
File "/usr/local/lib/python3.6/dist-packages/google/resumable_media/_helpers.py", line 93, in require_status_code
status_code, u'Expected one of', *status_codes)
google.resumable_media.common.InvalidResponse: ('Request failed with status code', 400, 'Expected one of', <HTTPStatus.OK: 200>, 308)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.6/dist-packages/google/cloud/storage/blob.py", line 1089, in upload_from_file
_raise_from_invalid_response(exc)
File "/usr/local/lib/python3.6/dist-packages/google/cloud/storage/blob.py", line 1960, in _raise_from_invalid_response
raise exceptions.from_http_status(response.status_code, message, response=response)
google.api_core.exceptions.BadRequest: 400 PUT https://www.googleapis.com/upload/storage/v1/b/my-bucket/o?uploadType=resumable&upload_id=AEnB2Uo0YkAqrWxqv4zVpm7bsO1mbUCGNIjxQPrQa4OV5HPad6kQatXYUF0UWVc8rWTMGEoYRIKH-QBUGmd35-u6FLRw04c4-A: ('Request failed with status code', 400, 'Expected one of', <HTTPStatus.OK: 200>, 308)
И когда я отображаю больше информации, я получаю следующий фрагмент кода b'Invalid request. There were 3 byte(s) in the request body. There should have been 6 byte(s) (starting at offset 0 and ending at offset 5) according to the Content-Range header.'
Решением было открыть файл в двоичном режиме и затем закодировать строку, но я подумал, чтоэто было бесполезно делать в Linux.
Я что-то упустил?Является ли хорошей практикой всегда манипулировать строкой как байтами, чтобы избежать этой ошибки, или это что-то из gcp?