Не удается скопировать / загрузить файл хранилища BLOB-объектов в папку функций Azure - PullRequest
0 голосов
/ 08 ноября 2019

Вот подробности проблемы:

  • Мы можем загрузить файл в хранилище BLOB-объектов Azure.
  • У нас также есть функция Azure, которая запускает Python (python 3.6)Приложение (engine / init .py), использующее HTTP-триггер (функция, по сути, берет файл и запускает его через службу распознавания динамиков Azure)
  • Мы можем запустить код на локальной машинеи это работает.

Проблема заключается в том, что мы перемещаем код в облако Azure (настроенное как компьютер Linux) и хотим получить доступ к файлу в хранилище BLOB-объектов, приложение не работает (возвращает ошибку 500). Мы убедились, что путь правильный (и источник, и место назначения), мы можем увидеть файл в хранилище BLOB-объектов, но мы не можем прочитать содержимое файла в хранилище BLOB-объектов (то есть мы не можем прочитать текст в файле .txt) имы не можем скопировать или загрузить файл в каталог функций Azure.

Сведения о доступе к файлу находятся в файле с именем downloadFile.py (см. код ниже), который использует BlockBlobService для соединения с хранилищем BLOB-объектов Azure.

  • Мы используем block_blob_service.list_blob для поиска файла
  • Мы используем block_blob_service.get_blob_to_path для загрузки файла

Обе функции работают нормально на локальном компьютерепоскольку у нас есть библиотека azure-storage-blob, включенная в наш файл needs.txt.

В конечном счете, наша цель заключается в том, чтобы нам понадобилось приложение python для доступа к файлу в хранилище BLOB-объектов и возврата результата. Мы открыты для того, как этого достичь. Заранее спасибо за помощь.

Вот содержимое файла needs.txt:

azure-functions
azure-storage-blob == 1.5.0

Вот наш код (downloadFile.py):

from azure.storage.blob import BlockBlobService, PublicAccess
import os, uuid, sys

def run_sample():
    try:
        # Create the BlockBlockService that is used to call the Blob service for the storage account
        block_blob_service = BlockBlobService(account_name='', account_key='')
        # Create a container called 'quickstartblobs'.
        #container_name ='quickstartblobs'
        container_name ='images'
        #block_blob_service.create_container(container_name)

        # Set the permission so the blobs are public.
        #block_blob_service.set_container_acl(container_name, public_access=PublicAccess.Container)

        # Create a file in Documents to test the upload and download.

        __location__ = os.path.realpath(
        os.path.join(os.getcwd(), os.path.dirname(__file__)))
        #local_path = os.path.join(__location__, 'SoundsForJay/')
        local_path = os.path.join(__location__)
        # not able to download file to azure function.


        #local_path=os.path.abspath(os.path.curdir)

        # List the blobs in the container
        print("\nList blobs in the container")
        generator = block_blob_service.list_blobs(container_name)
        for blob in generator:
            print("\t Blob name: " + blob.name)
            if ".wav" in blob.name:
                local_file_name = blob.name

        # Download the blob(s).
        # Add '_DOWNLOADED' as prefix to '.txt' so you can see both files in Documents.

        #full_path_to_file2 = os.path.join(local_path, str.replace(local_file_name ,'.txt', '_DOWNLOADED.txt'))
        full_path_to_file2 = os.path.join(local_path, str.replace(local_file_name ,'.wav', '_DOWNLOADED.wav'))
        print("\nDownloading blob to " + full_path_to_file2)
        block_blob_service.get_blob_to_path(container_name, local_file_name, full_path_to_file2)

        sys.stdout.write("Sample finished running. When you hit <any key>, the sample will be deleted and the sample "
                         "application will exit.")
        sys.stdout.flush()
        #input()

        # Clean up resources. This includes the container and the temp files
        #block_blob_service.delete_container(container_name)
        #os.remove(full_path_to_file)
        #os.remove(full_path_to_file2)
    except Exception as e:
        print(e)
    return "run_sample is running."

1 Ответ

0 голосов
/ 11 ноября 2019

Теперь функция Python Azure не позволяет записывать файл, это режим только для чтения, который не может быть изменен. Таким образом, вы не можете использовать get_blob_to_path, потому что можете записать файл на свой диск.

Поэтому, если вы просто хотите прочитать содержимое текстового файла, вы можете использовать следующий код

filename = "test.txt"
account_name = "storage account"
account_key = "account key"

input_container_name="test"
block_blob_service = BlockBlobService(account_name, account_key)
blobstring = block_blob_service.get_blob_to_text(input_container_name, filename).content

Также выможно использовать функцию привязка BLOB-объекта для чтения содержимого, связать inputblob как поток.

def main(req: func.HttpRequest,inputblob: func.InputStream) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')

name = req.params.get('name')
if not name:
    try:
        req_body = req.get_json()
    except ValueError:
        pass
    else:
        name = req_body.get('name')

if name:
    return func.HttpResponse(inputblob.read(size=-1))
else:
    return func.HttpResponse(
         "Please pass a name on the query string or in the request body",
         status_code=400
    )

enter image description here

...