简体   繁体   中英

Adding metadata to Azure blob with Python SDK & Azure Functions

I have encountered a problem when setting blob metadata in Azure Storage. I have developed a script for this in Spyder, so local Python, which works great. Now, I want to be able to execute this same script as an Azure Function. However, when setting the metadata I get the following error: HttpResponseError: The specifed resource name contains invalid characters.

The only change from Spyder to Functions that I made is:

Spyder:

def main(container_name,blob_name,metadata):
    from azure.storage.blob import BlobServiceClient
    
    # Connection string to storage account
    storageconnectionstring=secretstoragestringnotforstackoverflow
    
    # initialize clients
    blobclient_from_connectionstring=BlobServiceClient.from_connection_string(storageconnectionstring)
    containerclient=blobclient_from_connectionstring.get_container_client(container_name)
    blob_client = containerclient.get_blob_client(blob_name)
    
    # set metadata of container
    blob_client.set_blob_metadata(metadata=metadata)

    return

Functions

def main(req: func.HttpRequest):

    container_name = req.params.get('container_name')
    blob_name = req.params.get('blob_name')
    metadata_raw = req.params.get('metadata')

    metadata_json = json.loads(metadata_raw) 
    
    # Connection string to storage account
    storageconnectionstring=secretstoragestringnotforstackoverflow
    
    # initialize clients
    blobclient_from_connectionstring=BlobServiceClient.from_connection_string(storageconnectionstring)
    containerclient=blobclient_from_connectionstring.get_container_client(container_name)
    blob_client = containerclient.get_blob_client(blob_name)
   
    # set metadata of container
    blob_client.set_blob_metadata(metadata=metadata_json)
    
    return func.HttpResponse()

Arguments to the Function are passed in the header. Problem lies with metadata and not container_name or blob_name as I get no error when I comment out metadata. Also, I tried formatting metadata in many variations with single or double quotes and as JSON or as string but no luck so far. Anyone who could help me solve this problem?

I was able to fix the problem. Script was fine, problem was in the input parameters. They needed to be in a specific format. metadata as a dict with double quotes and blob/container as string without any quote.

As request the function.json:

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}

With parameter formatting: Picture from Azure Functions

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM