Функция copy_blob завершается ошибкой, когда в URL-адресе блоба есть "En Dash" (-) - PullRequest
0 голосов
/ 09 июля 2019

Мне нужно скопировать файл с чертой «Depot - Week.xlsx» в другое хранилище BLOB-объектов (контейнер).

block_blob_service - это объект класса BlockBlobService (azure.storage.blob.blockblobservice)

фрагмент кода ниже:

block_blob_service.copy_blob(archive_container, "pleasegodpleaseplease.xlsx",                                                         "https://dapblobstorage.blob.core.windows.net/daps3blob/kuldeep/Depot – Week.xlsx")

Я получаю следующую ошибку -

Client-Request-ID = 9e183a7e-a24d-11e9-9423-f48e389d3b95 Политика повторных попыток не допускает повторных попыток:, код состояния HTTP = неизвестно, исключительная ситуация = латинский-1.
Не удалось заархивировать файлы: латинский-1

1 Ответ

1 голос
/ 10 июля 2019

Так же, как сводка для комментариев и моего дополнительного контента.

Существует официальный документ Naming and Referencing Containers, Blobs, and Metadata, который описывает, какие символы нельзя использовать в имени контейнера или BLOB-объекта.Чтобы исправить это, обычное решение состоит в том, чтобы кодировать имя или URL-адрес с помощью UTF-8 / URL Encoder.

В Python код такой же, как показано ниже, и устранить проблему для некоторых специальных символов, таких как : и/ не нужно кодировать функцией urllib.parse.quote с параметром safe.

enter image description here

# In Python 3.7
from urllib import parse
url_str = 'https://dapblobstorage.blob.core.windows.net/daps3blob/kuldeep/Depot - Week.xlsx'
url_str_quoted = parse.quote(url_str, safe=':/')
print(url_str_quoted)
# The result is  https://dapblobstorage.blob.core.windows.net/daps3blob/kuldeep/Depot%20-%20Week.xlsx

# for En Dash
print(parse.quote('Depot – Week.xlsx'))
# The result is Depot%20%E2%80%93%20Week.xlsx

Примечание: символ тире (-) может использоваться в имени контейнера и большого двоичного объекта,

Каждый знак тире (-) должен начинаться сразу после буквы и цифры;последовательные тире не допускаются в именах контейнеров.

, но символ пробела нельзя использовать в имени контейнера и должен быть закодирован в имени BLOB-объекта и его URL-адресе.

...