2013-11-17 2 views
0

, пожалуйста, как я могу загрузить двоичный объект с типом страницы лазурного эту страницу в файл VHD «большое содержание» выполните следующую функцию:загрузить страницу блоб в лазурных с помощью REST API питона

def upload(blob_service, container_name, blob_name, file_path): 
blob_service.create_container(container_name, None, None, False) 
blob_service.put_blob(container_name, blob_name, '', "PageBlob") 
data_sent=0 
sent = 0 
block_ids = [] 
block_ids = [] 
index = 0 
with open(file_path, 'rb') as f: 
    while True: 
     data = f.read(PAGE_SIZE) 
     if data: 
      length = len(data) 
      #block_id = base64.b64encode(str(index)) 
      x_range  = 'bytes={}-{}'.format(index, index + pageSize - 1) 
      blob_service.put_page(container_name, blob_name, data, x_ms_range = x_range,x_ms_page_write = 'clear') 
      block_ids.append(block_id) 
      index += 1 
      data_sent += PAGE_SIZE 
      sent = data_sent/(1024*1024) 
      sys.stdout.write("\rUploaded data = %d MB"%sent) 
      sys.stdout.flush()   
     else: 
      break 

blob_service.put_block_list(container_name, blob_name, block_ids) 

и Ошибка была:

Traceback (most recent call last):                                           
    File "ehcpazurenew.py", line 331, in <module> 
    upload(blob_service,container_name,blob_name,file_path) 
    File "ehcpazurenew.py", line 250, in upload 
    blob_service.put_blob(container_name, blob_name, '', "PageBlob") 
    File "/home/ahmed/Desktop/azure/storage/blobservice.py", line 486, in put_blob 
    response = self._perform_request(request) 
    File "/home/ahmed/Desktop/azure/storage/storageclient.py", line 145, in _perform_request 
    _storage_error_handler(e) 
    File "/home/ahmed/Desktop/azure/storage/__init__.py", line 757, in _storage_error_handler 
    return _general_error_handler(http_error) 
    File "/home/ahmed/Desktop/azure/__init__.py", line 649, in _general_error_handler 
    raise WindowsAzureError(_ERROR_UNKNOWN % http_error.message + '\n' + http_error.respbody) 
    azure.WindowsAzureError: Unknown error (An HTTP header that's mandatory for this request is not specified.) 
<?xml version="1.0" encoding="utf-8"?><Error><Code>MissingRequiredHeader</Code> <Message>An HTTP header that's mandatory for this request is not specified. 
RequestId:5a839a6d-2a0f-4559-bc6d-e3b2cccf84f5 
Time:2013-11-17T13:12:03.8206435Z</Message><HeaderName>x-ms-blob-content-length</HeaderName></Error> 

Но заголовок HTTP был прав:

[('x-ms-blob-type', 'PageBlob'), ('Content-Encoding', None), ('Content-Language', None), ('Content-MD5', None), ('Cache-Control', None), ('x-ms-blob-content-type', None), ('x-ms-blob-content-encoding', None), ('x-ms-blob-content-language', None), ('x-ms-blob-content-md5', None), ('x-ms-blob-cache-control', None), ('x-ms-meta-name-values', None), ('x-ms-lease-id', None), ('x-ms-blob-content-length', None), ('x-ms-blob-sequence-number', None)] 

ответ

0

Вы должны пройти соответствующее значение в x-ms-blob-content-length заголовок запроса и на основе фрагмента заголовка в вашем вопросе выше, вы передаете это как None.

Еще одна вещь, которую я заметил, это то, что вы вызываете метод put_block_list после загрузки страниц. Обратите внимание, что эта операция не требуется для капель страницы. Как только операция put_page завершится успешно, ваши данные будут зафиксированы. put_block_list метод необходим для Block Blobs.

Также я заметил, что ваша переменная index всегда увеличивается на 1. Не следует увеличивать ее на PAGE_SIZE? Как сейчас, ваша переменная x_range все привинчена. Предполагая, что ваша переменная PAGE_SIZE равна 1024, переменная x_range будет равна:

Итерация # | индекс | x_range

0 | 0 | 0-1023

1 | 1 | 1-1024

2 | 2 | 2-1025

Возможно, вы захотите также изучить это.

==================================================================================================================================

UPDATE

Так что я думаю, я знаю, почему вы работаете с этой проблемой. В основном ваша эта строка кода вызывает проблемы:

blob_service.put_page(container_name, blob_name, data, x_ms_range = x_range,x_ms_page_write = 'clear') 

Если вы заметили, вы передаете значение для x_ms_page_write в clear. Измените это значение на update, и ваш код должен работать нормально. На основании документации для операции Put Page, когда вы укажете clear как значение для x_ms_page_write, длина содержимого должна быть равна 0. В любом случае, поскольку вы загружаете страницу blob, значение этого заголовка должно быть update.

Вот код, который я написал. Здесь я загрузив 10 МБ VHD в хранилище больших двоичных объектов:

import sys 
from azure.storage import * 


def myupload(blob_service, container_name, blob_name, file_path): 
    blob_service.create_container(container_name, None, None, False) 
    blob_service.put_blob(container_name, blob_name, '', 'PageBlob',x_ms_blob_content_length=10486272) 
    data_sent=0 
    sent = 0 
    block_ids = [] 
    index = 0 
    PAGE_SIZE = 512 
    pageSize = 512 
    with open(file_path, 'rb') as f: 
     while True: 
      data = f.read(pageSize) 
      if data: 
       length = len(data) 
       #sys.stdout.write("\rlength = %d "%length) 
       #sys.stdout.flush() 
       x_range  = 'bytes={}-{}'.format(index, index + pageSize - 1) 
       sys.stdout.write("\rx_range = %s "%x_range) 
       #sys.stdout.flush() 
       blob_service.put_page(container_name, blob_name, data, x_ms_range = x_range, x_ms_page_write = 'update') 
       index += PAGE_SIZE 
       data_sent += PAGE_SIZE 
       sent = data_sent/(1024*1024) 
       #sys.stdout.write("\rUploaded data = %d MB"%sent) 
       #sys.stdout.flush() 
      else: 
       break 

blob_service = BlobService(account_name="myaccountname", account_key="myaccountkey") 
myupload (blob_service, 'mycontainer', 'test.vhd', 'D:\\test.vhd') 
+0

Я должен изменить свой сценарий, прежде чем комментировать, но спасибо за вашу помощь, также PAGE_SIZE, как указано в лазурной документации должно быть 512 байт !! я не знаю почему .. но что я прочитал. – aabdulwahed

+0

Это результат после модификации: InvalidHeaderValue Значение для одного из HTTP-заголовков не в правильном формате. RequestID: 8f2ae87d-46e3-4d60-b884-fee92f9b0803 Время: 2013-11-17T17: 07: 37.9286660Z Content-Length 512 aabdulwahed

+0

Что значение переменной PAGE_SIZE? Размер каждой страницы должен быть не более 512 байт. –

Смежные вопросы