Enlaces de Azure Blob Storage para Azure FunctionsAzure Blob storage bindings for Azure Functions

En este artículo se explica cómo trabajar con enlaces de Azure Blob Storage en Azure Functions.This article explains how to work with Azure Blob storage bindings in Azure Functions. Azure Functions admite enlaces de desencadenador, entrada y salida para blobs.Azure Functions supports trigger, input, and output bindings for blobs. El artículo incluye una sección para cada enlace:The article includes a section for each binding:

Esta es la información de referencia para desarrolladores de Azure Functions.This is reference information for Azure Functions developers. Si está familiarizado con Azure Functions, comience con los siguientes recursos:If you're new to Azure Functions, start with the following resources:

Nota

Utilice el desencadenador de Event Grid en lugar del desencadenador de Blob Storage para las cuentas de almacenamiento solo para blobs, para operaciones a gran escala o para reducir la latencia.Use the Event Grid trigger instead of the Blob storage trigger for blob-only storage accounts, for high scale, or to reduce latency. Para obtener más información, consulte la sección Desencadenador.For more information, see the Trigger section.

Paquetes: Functions 1.xPackages - Functions 1.x

Los enlaces de Blob Storage se proporcionan en el paquete NuGet Microsoft.Azure.WebJobs, versión 2.x.The Blob storage bindings are provided in the Microsoft.Azure.WebJobs NuGet package, version 2.x. El código fuente del paquete se encuentra en el repositorio azure-webjobs-sdk de GitHub.Source code for the package is in the azure-webjobs-sdk GitHub repository.

En todos los entornos de desarrollo, se proporciona automáticamente compatibilidad para este enlace.Support for this binding is automatically provided in all development environments. No tiene que instalar el paquete manualmente ni que registrar la extensión.You don't have to manually install the package or register the extension.

Versión de SDK de Azure Storage en Functions 1.xAzure Storage SDK version in Functions 1.x

En Functions 1.x, los desencadenadores y enlaces de Storage usan la versión 7.2.1 del SDK de Azure Storage (paquete NuGet WindowsAzure.Storage)In Functions 1.x, the Storage triggers and bindings use version 7.2.1 of the Azure Storage SDK (WindowsAzure.Storage NuGet package). Si hace referencia a una versión diferente del SDK de Storage y enlaza a un tipo de SDK de Storage en la signatura de función, el runtime de Functions puede notificar que no se puede enlazar con ese tipo.If you reference a different version of the Storage SDK, and you bind to a Storage SDK type in your function signature, the Functions runtime may report that it can't bind to that type. La solución es asegurarse de que el proyecto hace referencia a WindowsAzure.Storage 7.2.1.The solution is to make sure your project references WindowsAzure.Storage 7.2.1.

Paquetes: Functions 2.xPackages - Functions 2.x

Los enlaces de almacenamiento de Blob se proporcionan en el paquete NuGet Microsoft.Azure.WebJobs.Extensions.Storage, versión 3.x.The Blob storage bindings are provided in the Microsoft.Azure.WebJobs.Extensions.Storage NuGet package, version 3.x. El código fuente del paquete se encuentra en el repositorio azure-webjobs-sdk de GitHub.Source code for the package is in the azure-webjobs-sdk GitHub repository.

En la siguiente tabla se explica cómo agregar compatibilidad para este enlace en cada entorno de desarrollo.The following table tells how to add support for this binding in each development environment.

Entorno de desarrolloDevelopment environment Para agregar compatibilidad enTo add support in
Functions 2.xFunctions 2.x
Desarrollo local: biblioteca de clases C#Local development - C# class library Instalación del paqueteInstall the package
Desarrollo local: script de C#, JavaScript, F#, Java y PythonLocal development - C# script, JavaScript, F#, Java and Python Registro de la extensiónRegister the extension
Desarrollo con PortalPortal development Instalación al agregar el enlace de salidaInstall when adding output binding

Para saber cómo actualizar las extensiones de enlace existentes en el portal sin tener que volver a publicar su proyecto de aplicación de función, consulte Actualización de las extensiones.To learn how to update existing binding extensions in the portal without having to republish your function app project, see Update your extensions.

DesencadenadorTrigger

El desencadenador de Blob Storage inicia una función cuando se detecta un blob nuevo o actualizado.The Blob storage trigger starts a function when a new or updated blob is detected. El contenido del blob se proporciona a modo de entrada para la función.The blob contents are provided as input to the function.

El desencadenador de Event Grid tiene compatibilidad integrada para eventos de blob y también puede utilizarse para iniciar una función cuando se detecta un blob nuevo o actualizado.The Event Grid trigger has built-in support for blob events and can also be used to start a function when a new or updated blob is detected. Para obtener un ejemplo, consulte el tutorial Cambio de tamaño de una imagen con Event Grid.For an example, see the Image resize with Event Grid tutorial.

Utilice Event Grid en lugar del desencadenador de Blob Storage en los escenarios siguientes:Use Event Grid instead of the Blob storage trigger for the following scenarios:

  • Cuentas de Almacenamiento de blobsBlob storage accounts
  • Gran escalaHigh scale
  • Minimización de la latenciaMinimizing latency

Cuentas de Almacenamiento de blobsBlob storage accounts

Las cuentas de Blob Storage se admiten para enlaces de entrada y salida de blobs, pero no para desencadenadores de blobs.Blob storage accounts are supported for blob input and output bindings but not for blob triggers. Los desencadenadores de Blob Storage necesitan una cuenta de almacenamiento de uso general.Blob storage triggers require a general-purpose storage account.

Gran escalaHigh scale

Gran escala se aplica generalmente a contenedores que tienen más de 100 000 blobs en ellos o a cuentas de almacenamiento que tienen más de 100 actualizaciones de blob por segundo.High scale can be loosely defined as containers that have more than 100,000 blobs in them or storage accounts that have more than 100 blob updates per second.

Problemas de latenciaLatency issues

Si la aplicación de función está en un plan de consumo, puede haber un retraso de hasta 10 minutos en el procesamiento de nuevos blobs si una aplicación de función ha quedado inactiva.If your function app is on the Consumption plan, there can be up to a 10-minute delay in processing new blobs if a function app has gone idle. Para evitar esta latencia, puede cambiar a un plan de App Service con Always On habilitado.To avoid this latency, you can switch to an App Service plan with Always On enabled. También puede usar un desencadenador de Event Grid con su cuenta de almacenamiento de blobs.You can also use an Event Grid trigger with your Blob storage account. Para ver un ejemplo, consulte el tutorial de Event Grid.For an example, see the Event Grid tutorial.

Desencadenador de Queue StorageQueue storage trigger

Además de Event Grid, otra alternativa para el procesamiento de blobs es el desencadenador de Queue Storage, pero no tiene ninguna compatibilidad integrada para los eventos de blobs.Besides Event Grid, another alternative for processing blobs is the Queue storage trigger, but it has no built-in support for blob events. Debería crear mensajes en cola al crear o actualizar blobs.You would have to create queue messages when creating or updating blobs. Para ver un ejemplo que presupone que ya ha realizado eso, consulte el ejemplo de enlaces de entrada de blob más adelante en este artículo.For an example that assumes you've done that, see the blob input binding example later in this article.

Desencadenador: ejemploTrigger - example

Vea el ejemplo específico del lenguaje:See the language-specific example:

Desencadenador: ejemplo de C#Trigger - C# example

En el ejemplo siguiente se muestra una función de C# que escribe un registro cuando se agrega o se actualiza un blob en el contenedor samples-workitems.The following example shows a C# function that writes a log when a blob is added or updated in the samples-workitems container.

[FunctionName("BlobTriggerCSharp")]        
public static void Run([BlobTrigger("samples-workitems/{name}")] Stream myBlob, string name, ILogger log)
{
    log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}

La cadena {name} en la ruta de acceso del desencadenador de blobs samples-workitems/{name} crea una expresión de enlace que puede usar en el código de función para acceder al nombre de archivo del blob de desencadenamiento.The string {name} in the blob trigger path samples-workitems/{name} creates a binding expression that you can use in function code to access the file name of the triggering blob. Para más información, consulte Patrones de nombre de blob que aparece más adelante en este artículo.For more information, see Blob name patterns later in this article.

Para obtener más información sobre el atributo BlobTrigger, consulte Desencadenador: atributos.For more information about the BlobTrigger attribute, see Trigger - attributes.

Desencadenador: ejemplo de script de C#Trigger - C# script example

En el ejemplo siguiente se muestra un enlace de desencadenador de blobs en un archivo function.json y el código de Python que usa el enlace.The following example shows a blob trigger binding in a function.json file and Python code that uses the binding. La función escribe un registro cuando se agrega o actualiza un blob en el contenedor samples-workitems.The function writes a log when a blob is added or updated in the samples-workitems container.

Estos son los datos de enlace del archivo function.json:Here's the binding data in the function.json file:

{
    "disabled": false,
    "bindings": [
        {
            "name": "myBlob",
            "type": "blobTrigger",
            "direction": "in",
            "path": "samples-workitems/{name}",
            "connection":"MyStorageAccountAppSetting"
        }
    ]
}

La cadena {name} en la ruta de acceso del desencadenador de blobs samples-workitems/{name} crea una expresión de enlace que puede usar en el código de función para acceder al nombre de archivo del blob de desencadenamiento.The string {name} in the blob trigger path samples-workitems/{name} creates a binding expression that you can use in function code to access the file name of the triggering blob. Para más información, consulte Patrones de nombre de blob que aparece más adelante en este artículo.For more information, see Blob name patterns later in this article.

Para más información sobre las propiedades del archivo function.json, consulte la sección Configuración donde se explican estas propiedades.For more information about function.json file properties, see the Configuration section explains these properties.

Este es el código de script de C# que se enlaza a Stream:Here's C# script code that binds to a Stream:

public static void Run(Stream myBlob, string name, ILogger log)
{
   log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}

Este es el código de script de C# que se enlaza a CloudBlockBlob:Here's C# script code that binds to a CloudBlockBlob:

#r "Microsoft.WindowsAzure.Storage"

using Microsoft.WindowsAzure.Storage.Blob;

public static void Run(CloudBlockBlob myBlob, string name, ILogger log)
{
    log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name}\nURI:{myBlob.StorageUri}");
}

Desencadenador: ejemplo de JavaScriptTrigger - JavaScript example

En el ejemplo siguiente se muestra un enlace de desencadenador de blob en un archivo function.json y el código de JavaScript que usa el enlace.The following example shows a blob trigger binding in a function.json file and JavaScript code that uses the binding. La función escribe un registro cuando se agrega o actualiza un blob en el contenedor samples-workitems.The function writes a log when a blob is added or updated in the samples-workitems container.

Este es el archivo function.json:Here's the function.json file:

{
    "disabled": false,
    "bindings": [
        {
            "name": "myBlob",
            "type": "blobTrigger",
            "direction": "in",
            "path": "samples-workitems/{name}",
            "connection":"MyStorageAccountAppSetting"
        }
    ]
}

La cadena {name} en la ruta de acceso del desencadenador de blobs samples-workitems/{name} crea una expresión de enlace que puede usar en el código de función para acceder al nombre de archivo del blob de desencadenamiento.The string {name} in the blob trigger path samples-workitems/{name} creates a binding expression that you can use in function code to access the file name of the triggering blob. Para más información, consulte Patrones de nombre de blob que aparece más adelante en este artículo.For more information, see Blob name patterns later in this article.

Para más información sobre las propiedades del archivo function.json, consulte la sección Configuración donde se explican estas propiedades.For more information about function.json file properties, see the Configuration section explains these properties.

Este es el código de JavaScript:Here's the JavaScript code:

module.exports = function(context) {
    context.log('Node.js Blob trigger function processed', context.bindings.myBlob);
    context.done();
};

Ejemplo de desencadenador de PythonTrigger - Python example

En el ejemplo siguiente se muestra un enlace de desencadenador de blobs en un archivo function.json y el código de Python que usa el enlace.The following example shows a blob trigger binding in a function.json file and Python code that uses the binding. La función escribe un registro cuando se agrega o actualiza un blob en el contenedor samples-workitems.The function writes a log when a blob is added or updated in the samples-workitems container.

Este es el archivo function.json:Here's the function.json file:

{
    "scriptFile": "__init__.py",
    "disabled": false,
    "bindings": [
        {
            "name": "myblob",
            "type": "blobTrigger",
            "direction": "in",
            "path": "samples-workitems/{name}",
            "connection":"MyStorageAccountAppSetting"
        }
    ]
}

La cadena {name} en la ruta de acceso del desencadenador de blobs samples-workitems/{name} crea una expresión de enlace que puede usar en el código de función para acceder al nombre de archivo del blob de desencadenamiento.The string {name} in the blob trigger path samples-workitems/{name} creates a binding expression that you can use in function code to access the file name of the triggering blob. Para más información, consulte Patrones de nombre de blob que aparece más adelante en este artículo.For more information, see Blob name patterns later in this article.

Para más información sobre las propiedades del archivo function.json, consulte la sección Configuración donde se explican estas propiedades.For more information about function.json file properties, see the Configuration section explains these properties.

Este es el código de Python:Here's the Python code:

import logging
import azure.functions as func


def main(myblob: func.InputStream):
    logging.info('Python Blob trigger function processed %s', myblob.name)

Desencadenador: ejemplo de JavaTrigger - Java example

En el ejemplo siguiente se muestra un enlace de desencadenador de blob en un archivo function.json y el código de Java que usa el enlace.The following example shows a blob trigger binding in a function.json file and Java code that uses the binding. La función escribe un registro cuando se agrega o actualiza un blob en el contenedor myblob.The function writes a log when a blob is added or updated in the myblob container.

Este es el archivo function.json:Here's the function.json file:

{
    "disabled": false,
    "bindings": [
        {
            "name": "file",
            "type": "blobTrigger",
            "direction": "in",
            "path": "myblob/{name}",
            "connection":"MyStorageAccountAppSetting"
        }
    ]
}

Este es el código de Java:Here's the Java code:

@FunctionName("blobprocessor")
public void run(
  @BlobTrigger(name = "file",
               dataType = "binary",
               path = "myblob/{name}",
               connection = "MyStorageAccountAppSetting") byte[] content,
  @BindingName("name") String filename,
  final ExecutionContext context
) {
  context.getLogger().info("Name: " + filename + " Size: " + content.length + " bytes");
}

Desencadenador: atributosTrigger - attributes

Para bibliotecas de clases de C#, utilice los siguientes atributos para configurar un desencadenador de blob:In C# class libraries, use the following attributes to configure a blob trigger:

  • BlobTriggerAttributeBlobTriggerAttribute

    El constructor del atributo toma una cadena de ruta de acceso que indica al contenedor que inspeccione y, opcionalmente, un patrón de nombre de blob.The attribute's constructor takes a path string that indicates the container to watch and optionally a blob name pattern. Este es un ejemplo:Here's an example:

    [FunctionName("ResizeImage")]
    public static void Run(
        [BlobTrigger("sample-images/{name}")] Stream image,
        [Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageSmall)
    {
        ....
    }
    

    Puede establecer la propiedad Connection para especificar la cuenta de almacenamiento que se usará, tal como se muestra en el ejemplo siguiente:You can set the Connection property to specify the storage account to use, as shown in the following example:

    [FunctionName("ResizeImage")]
    public static void Run(
        [BlobTrigger("sample-images/{name}", Connection = "StorageConnectionAppSetting")] Stream image,
        [Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageSmall)
    {
        ....
    }
    

    Para un ejemplo completo, consulte Desencadenador: ejemplo de C#.For a complete example, see Trigger - C# example.

  • StorageAccountAttributeStorageAccountAttribute

    Proporciona otra manera de especificar la cuenta de almacenamiento que se debe usar.Provides another way to specify the storage account to use. El constructor toma el nombre de una configuración de aplicación que contiene una cadena de conexión de almacenamiento.The constructor takes the name of an app setting that contains a storage connection string. El atributo se puede aplicar en el nivel de clase, método o parámetro.The attribute can be applied at the parameter, method, or class level. En el ejemplo siguiente se muestran el nivel de clase y de método:The following example shows class level and method level:

    [StorageAccount("ClassLevelStorageAppSetting")]
    public static class AzureFunctions
    {
        [FunctionName("BlobTrigger")]
        [StorageAccount("FunctionLevelStorageAppSetting")]
        public static void Run( //...
    {
        ....
    }
    

La cuenta de almacenamiento que se debe usar se determina en el orden siguiente:The storage account to use is determined in the following order:

  • La propiedad Connection del atributo BlobTrigger.The BlobTrigger attribute's Connection property.
  • El atributo StorageAccount aplicado al mismo parámetro que el atributo BlobTrigger.The StorageAccount attribute applied to the same parameter as the BlobTrigger attribute.
  • El atributo StorageAccount aplicado a la función.The StorageAccount attribute applied to the function.
  • El atributo StorageAccount aplicado a la clase.The StorageAccount attribute applied to the class.
  • La cuenta de almacenamiento predeterminada de la aplicación de función (configuración de aplicación "AzureWebJobsStorage").The default storage account for the function app ("AzureWebJobsStorage" app setting).

Desencadenador: configuraciónTrigger - configuration

En la siguiente tabla se explican las propiedades de configuración de enlace que se definen en el archivo function.json y el atributo BlobTrigger.The following table explains the binding configuration properties that you set in the function.json file and the BlobTrigger attribute.

Propiedad de function.jsonfunction.json property Propiedad de atributoAttribute property DESCRIPCIÓNDescription
typetype N/Dn/a Se debe establecer en blobTrigger.Must be set to blobTrigger. Esta propiedad se establece automáticamente cuando se crea el desencadenador en Azure Portal.This property is set automatically when you create the trigger in the Azure portal.
directiondirection N/Dn/a Se debe establecer en in.Must be set to in. Esta propiedad se establece automáticamente cuando se crea el desencadenador en Azure Portal.This property is set automatically when you create the trigger in the Azure portal. Las excepciones se indican en la sección uso.Exceptions are noted in the usage section.
namename N/Dn/a Nombre de la variable que representa el blob en el código de la función.The name of the variable that represents the blob in function code.
pathpath BlobPathBlobPath El contenedor que se va a supervisar.The container to monitor. Puede ser un patrón de nombre de blob.May be a blob name pattern.
conexiónconnection ConnectionConnection El nombre de una configuración de aplicación que contiene la cadena de conexión de almacenamiento que se usará para este enlace.The name of an app setting that contains the Storage connection string to use for this binding. Si el nombre de la configuración de aplicación comienza con "AzureWebJobs", puede especificar solo el resto del nombre aquí.If the app setting name begins with "AzureWebJobs", you can specify only the remainder of the name here. Por ejemplo, si establece connection en "MyStorage", el entorno en tiempo de ejecución de Functions busca una configuración de aplicación denominada "AzureWebJobsMyStorage".For example, if you set connection to "MyStorage", the Functions runtime looks for an app setting that is named "AzureWebJobsMyStorage." Si deja connection vacía, el entorno en tiempo de ejecución de Functions usa la cadena de conexión de almacenamiento predeterminada en la configuración de aplicación que se denomina AzureWebJobsStorage.If you leave connection empty, the Functions runtime uses the default Storage connection string in the app setting that is named AzureWebJobsStorage.

La cadena de conexión debe ser para una cuenta de almacenamiento de uso general, no una cuenta de Blob Storage.The connection string must be for a general-purpose storage account, not a Blob storage account.

Cuando desarrolla localmente, la configuración de aplicación pasa al archivo local.settings.json.When you're developing locally, app settings go into the local.settings.json file.

Desencadenador: usoTrigger - usage

En C# y el script de C#, puede usar los tipos de parámetros siguientes para el blob de desencadenamiento:In C# and C# script, you can use the following parameter types for the triggering blob:

  • Stream
  • TextReader
  • string
  • Byte[]
  • Un objeto POCO serializable como JSONA POCO serializable as JSON
  • ICloudBlob1ICloudBlob1
  • CloudBlockBlob1CloudBlockBlob1
  • CloudPageBlob1CloudPageBlob1
  • CloudAppendBlob1CloudAppendBlob1

1 requiere un enlace "inout" direction en function.json o FileAccess.ReadWrite en una biblioteca de clases de C#.1 Requires "inout" binding direction in function.json or FileAccess.ReadWrite in a C# class library.

Si intenta enlazar a uno de los tipos de SDK de Storage y recibe un mensaje de error, asegúrese de que hace referencia a la versión de SDK de Storage correcta.If you try to bind to one of the Storage SDK types and get an error message, make sure that you have a reference to the correct Storage SDK version.

El enlace a string, Byte[] o POCO solo se recomienda si el tamaño de blob es pequeño, ya que todo el contenido del blob se carga en memoria.Binding to string, Byte[], or POCO is only recommended if the blob size is small, as the entire blob contents are loaded into memory. Por lo general, es preferible usar un tipo Stream o CloudBlockBlob.Generally, it is preferable to use a Stream or CloudBlockBlob type. Para obtener más información, consulte Uso de simultaneidad y memoria más adelante en este artículo.For more information, see Concurrency and memory usage later in this article.

En JavaScript, acceda a los datos de blob de entrada mediante context.bindings.<name from function.json>.In JavaScript, access the input blob data using context.bindings.<name from function.json>.

Desencadenador: patrones de nombre de blobTrigger - blob name patterns

Puede especificar un patrón de nombre de blob en la propiedad path en function.json o en el constructor de atributos BlobTrigger.You can specify a blob name pattern in the path property in function.json or in the BlobTrigger attribute constructor. El patrón de nombre puede ser una expresión de filtro o enlace.The name pattern can be a filter or binding expression. En las siguientes secciones se proporcionan ejemplos.The following sections provide examples.

Obtener el nombre y la extensión de archivoGet file name and extension

En el ejemplo siguiente se muestra cómo enlazar a nombre de archivo del blob y la extensión por separado:The following example shows how to bind to the blob file name and extension separately:

"path": "input/{blobname}.{blobextension}",

Si el blob se denomina original-Blob1.txt, los valores de las variables blobname y blobextension del código de la función son original-Blob1 y txt.If the blob is named original-Blob1.txt, the values of the blobname and blobextension variables in function code are original-Blob1 and txt.

Filtrar por nombre de blobFilter on blob name

El ejemplo siguiente se desencadena solo en blobs del contenedor input que comienzan con la cadena "original-":The following example triggers only on blobs in the input container that start with the string "original-":

"path": "input/original-{name}",

Si el nombre de blob es original Blob1.txt, el valor de la variable name en el código de la función es Blob1.If the blob name is original-Blob1.txt, the value of the name variable in function code is Blob1.

Filtrar por tipo de archivoFilter on file type

El siguiente ejemplo se desencadena solo en archivos .png:The following example triggers only on .png files:

"path": "samples/{name}.png",

Filtrar por llaves en nombres de archivoFilter on curly braces in file names

Para buscar llaves en nombres de archivo, escape las llaves mediante dos llaves.To look for curly braces in file names, escape the braces by using two braces. En el ejemplo siguiente se filtran blobs que tienen llaves en el nombre:The following example filters for blobs that have curly braces in the name:

"path": "images/{{20140101}}-{name}",

Si el blob se denomina {20140101}-soundfile.mp3, el valor de variable name en el código de la función es soundfile.mp3.If the blob is named {20140101}-soundfile.mp3, the name variable value in the function code is soundfile.mp3.

Desencadenador: metadatosTrigger - metadata

El desencadenador de blobs proporciona varias propiedades de metadatos.The blob trigger provides several metadata properties. Estas propiedades pueden usarse como parte de expresiones de enlace en otros enlaces o como parámetros del código.These properties can be used as part of binding expressions in other bindings or as parameters in your code. Estos valores tienen la misma semántica que el tipo CloudBlob.These values have the same semantics as the CloudBlob type.

PropiedadProperty EscribaType DESCRIPCIÓNDescription
BlobTrigger string Ruta de acceso del blob de desencadenamiento.The path to the triggering blob.
Uri System.Uri Es el identificador URI del blob correspondiente a la ubicación principal.The blob's URI for the primary location.
Properties BlobPropertiesBlobProperties Son las propiedades del sistema del blob.The blob's system properties.
Metadata IDictionary<string,string> Son los metadatos definidos por el usuario para el blob.The user-defined metadata for the blob.

Por ejemplo, los ejemplos de JavaScript y el script de C# siguientes registran la ruta de acceso al blob de desencadenamiento, incluido el contenedor:For example, the following C# script and JavaScript examples log the path to the triggering blob, including the container:

public static void Run(string myBlob, string blobTrigger, ILogger log)
{
    log.LogInformation($"Full blob path: {blobTrigger}");
} 
module.exports = function (context, myBlob) {
    context.log("Full blob path:", context.bindingData.blobTrigger);
    context.done();
};

Desencadenador: recepciones de blobsTrigger - blob receipts

El entorno en tiempo de ejecución de Azure Functions garantiza que no se llame más de una vez a ninguna función de desencadenador de blobs para un mismo blob, ya sea nuevo o actualizado.The Azure Functions runtime ensures that no blob trigger function gets called more than once for the same new or updated blob. Mantiene recepciones de blobs para determinar si se ha procesado una determinada versión de blob.To determine if a given blob version has been processed, it maintains blob receipts.

Azure Functions almacena confirmaciones de blobs en un contenedor llamado azure-webjobs-hosts en la cuenta de almacenamiento de Azure de la aplicación de función (que se especifica mediante la configuración de la aplicación AzureWebJobsStorage).Azure Functions stores blob receipts in a container named azure-webjobs-hosts in the Azure storage account for your function app (defined by the app setting AzureWebJobsStorage). Una recepción de blobs tiene la información siguiente:A blob receipt has the following information:

  • La función desencadenada (" <nombre de aplicación de función> .Functions. <nombre de función> ", por ejemplo: "MyFunctionApp.Functions.CopyBlob")The triggered function ("<function app name>.Functions.<function name>", for example: "MyFunctionApp.Functions.CopyBlob")
  • El nombre del contenedorThe container name
  • El tipo de blob ("BlockBlob" o "PageBlob")The blob type ("BlockBlob" or "PageBlob")
  • El nombre del blobThe blob name
  • ETag (un identificador de la versión del blob, por ejemplo: "0x8D1DC6E70A277EF")The ETag (a blob version identifier, for example: "0x8D1DC6E70A277EF")

Si desea forzar el reprocesamiento de un blob, puede eliminar manualmente la recepción de ese blob desde el contenedor azure-webjobs-hosts .To force reprocessing of a blob, delete the blob receipt for that blob from the azure-webjobs-hosts container manually. Al volver a procesar podría no producirse inmediatamente, pero se garantiza que se producirá más adelante en un momento dado.While reprocessing might not occur immediately, it's guaranteed to occur at a later point in time.

Desencadenador: blobs dudososTrigger - poison blobs

Si se produce un error en una función de desencadenador de blob, Azure Functions vuelve a intentar ejecutar esa función hasta 5 veces de forma predeterminada.When a blob trigger function fails for a given blob, Azure Functions retries that function a total of 5 times by default.

Si se produce un error en los 5 intentos, Azure Functions agregará un mensaje a una cola de Storage llamada webjobs-blobtrigger-poison.If all 5 tries fail, Azure Functions adds a message to a Storage queue named webjobs-blobtrigger-poison. El mensaje de cola para los blobs dudosos es un objeto JSON que contiene las siguientes propiedades:The queue message for poison blobs is a JSON object that contains the following properties:

  • FunctionId (con el formato <nombre de aplicación de función> .Functions. <nombre de función> )FunctionId (in the format <function app name>.Functions.<function name>)
  • BlobType ("BlockBlob" o "PageBlob")BlobType ("BlockBlob" or "PageBlob")
  • ContainerNameContainerName
  • BlobNameBlobName
  • ETag (un identificador de la versión del blob, por ejemplo: "0x8D1DC6E70A277EF")ETag (a blob version identifier, for example: "0x8D1DC6E70A277EF")

Desencadenador: uso de simultaneidad y memoriaTrigger - concurrency and memory usage

El desencadenador de blob utiliza una cola internamente, por lo que el número máximo de invocaciones de funciones simultáneas lo controla la configuración de colas en host.json.The blob trigger uses a queue internally, so the maximum number of concurrent function invocations is controlled by the queues configuration in host.json. La configuración predeterminada limita la simultaneidad a 24 invocaciones.The default settings limit concurrency to 24 invocations. Este límite se aplica por separado a cada función que usa un desencadenador de blob.This limit applies separately to each function that uses a blob trigger.

El plan de consumo limita una aplicación de función de una máquina virtual (VM) a 1,5 GB de memoria.The consumption plan limits a function app on one virtual machine (VM) to 1.5 GB of memory. Tanto las instancias de función que se ejecutan de forma simultánea como el entorno de ejecución de Functions utilizan la memoria.Memory is used by each concurrently executing function instance and by the Functions runtime itself. Si una función desencadenada por un blob carga el blob entero a la memoria, la memoria máxima utilizada por esa función solo para blobs tiene un tamaño máximo de blob de 24 *.If a blob-triggered function loads the entire blob into memory, the maximum memory used by that function just for blobs is 24 * maximum blob size. Por ejemplo, una aplicación de función con tres funciones desencadenadas por un blob y la configuración predeterminada tendrían una simultaneidad máxima por máquina virtual de 3*24 = 72 invocaciones de función.For example, a function app with three blob-triggered functions and the default settings would have a maximum per-VM concurrency of 3*24 = 72 function invocations.

Las funciones de JavaScript y Java cargan el blob entero a la memoria, mientras que las funciones de C# lo hacen si establece un enlace a string, Byte[] o POCO.JavaScript and Java functions load the entire blob into memory, and C# functions do that if you bind to string, Byte[], or POCO.

Desencadenador: sondeoTrigger - polling

Si el contenedor de blobs supervisado contiene más de 10 000 blobs (en todos los contenedores), el runtime de Functions examinará los archivos de registro para detectar blobs nuevos o modificados.If the blob container being monitored contains more than 10,000 blobs (across all containers), the Functions runtime scans log files to watch for new or changed blobs. Este proceso puede provocar retrasos.This process can result in delays. Una función podría tardar en desencadenarse varios minutos o más después de crear el blob.A function might not get triggered until several minutes or longer after the blob is created.

Advertencia

Además, se crean registros de almacenamiento basados en el principio del "mejor esfuerzo".In addition, storage logs are created on a "best effort" basis. No hay ninguna garantía de que se capturen todos los eventos.There's no guarantee that all events are captured. En algunos casos, podrían faltar registros.Under some conditions, logs may be missed.

Si necesita un procesamiento de blobs más rápido o confiable, considere crear un mensaje de cola al crear el blob.If you require faster or more reliable blob processing, consider creating a queue message when you create the blob. A continuación, use un desencadenador de cola, en lugar de un desencadenador de blob, para procesar el blob.Then use a queue trigger instead of a blob trigger to process the blob. Otra opción consiste en usar Event Grid; consulte el tutorial Automatizar el cambio de tamaño de imágenes cargadas mediante Event Grid.Another option is to use Event Grid; see the tutorial Automate resizing uploaded images using Event Grid.

EntradaInput

Utilice un enlace de entrada de almacenamiento de blobs para leer blobs.Use a Blob storage input binding to read blobs.

Ejemplo de entradaInput - example

Vea el ejemplo específico del lenguaje:See the language-specific example:

Entrada: ejemplo de C#Input - C# example

El ejemplo siguiente es una función de C# que utiliza un desencadenador de cola y un enlaces de blobs de entrada.The following example is a C# function that uses a queue trigger and an input blob binding. El mensaje de cola contiene el nombre del blob y la función registra el tamaño del blob.The queue message contains the name of the blob, and the function logs the size of the blob.

[FunctionName("BlobInput")]
public static void Run(
    [QueueTrigger("myqueue-items")] string myQueueItem,
    [Blob("samples-workitems/{queueTrigger}", FileAccess.Read)] Stream myBlob,
    ILogger log)
{
    log.LogInformation($"BlobInput processed blob\n Name:{myQueueItem} \n Size: {myBlob.Length} bytes");
}

Entrada: ejemplo de script de C#Input - C# script example

En el ejemplo siguiente se muestran enlaces de entrada y salida de blobs en un archivo function.json y código de script de C# (.csx) que usa los enlaces.The following example shows blob input and output bindings in a function.json file and C# script (.csx) code that uses the bindings. La función realiza una copia de un blob de texto.The function makes a copy of a text blob. La función se activa mediante un mensaje de cola que contiene el nombre del blob que se va a copiar.The function is triggered by a queue message that contains the name of the blob to copy. El nuevo blob se denomina {nombreoriginaldelblob}-Copy.The new blob is named {originalblobname}-Copy.

En el archivo function.json, la propiedad de metadatos queueTrigger se utiliza para especificar el nombre del blob en las propiedades de path:In the function.json file, the queueTrigger metadata property is used to specify the blob name in the path properties:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "myOutputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}-Copy",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false
}

En la sección de configuración se explican estas propiedades.The configuration section explains these properties.

Este es el código de script de C#:Here's the C# script code:

public static void Run(string myQueueItem, string myInputBlob, out string myOutputBlob, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    myOutputBlob = myInputBlob;
}

Entrada: ejemplo de JavaScriptInput - JavaScript example

En el ejemplo siguiente se muestran enlaces de entrada y salida de blobs en un archivo function.json y código de script de JavaScript que usa los enlaces.The following example shows blob input and output bindings in a function.json file and JavaScript code that uses the bindings. La función realiza una copia de un blob.The function makes a copy of a blob. La función se activa mediante un mensaje de cola que contiene el nombre del blob que se va a copiar.The function is triggered by a queue message that contains the name of the blob to copy. El nuevo blob se denomina {nombreoriginaldelblob}-Copy.The new blob is named {originalblobname}-Copy.

En el archivo function.json, la propiedad de metadatos queueTrigger se utiliza para especificar el nombre del blob en las propiedades de path:In the function.json file, the queueTrigger metadata property is used to specify the blob name in the path properties:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "myOutputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}-Copy",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false
}

En la sección de configuración se explican estas propiedades.The configuration section explains these properties.

Este es el código de JavaScript:Here's the JavaScript code:

module.exports = function(context) {
    context.log('Node.js Queue trigger function processed', context.bindings.myQueueItem);
    context.bindings.myOutputBlob = context.bindings.myInputBlob;
    context.done();
};

Entrada: ejemplo de PythonInput - Python example

En el ejemplo siguiente se muestran enlaces de entrada y salida de blobs en un archivo function.json y el código de Python que usa los enlaces.The following example shows blob input and output bindings in a function.json file and Python code that uses the bindings. La función realiza una copia de un blob.The function makes a copy of a blob. La función se activa mediante un mensaje de cola que contiene el nombre del blob que se va a copiar.The function is triggered by a queue message that contains the name of the blob to copy. El nuevo blob se denomina {nombreoriginaldelblob}-Copy.The new blob is named {originalblobname}-Copy.

En el archivo function.json, la propiedad de metadatos queueTrigger se utiliza para especificar el nombre del blob en las propiedades de path:In the function.json file, the queueTrigger metadata property is used to specify the blob name in the path properties:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "queuemsg",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "inputblob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "$return",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}-Copy",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false,
  "scriptFile": "__init__.py"
}

En la sección de configuración se explican estas propiedades.The configuration section explains these properties.

Este es el código de Python:Here's the Python code:

import logging
import azure.functions as func


def main(queuemsg: func.QueueMessage, inputblob: func.InputStream) -> func.InputStream:
    logging.info('Python Queue trigger function processed %s', inputblob.name)
    return inputblob

Entrada: ejemplos de JavaInput - Java examples

En esta sección se incluyen los ejemplos siguientes:This section contains the following examples:

Desencadenador de HTTP, búsqueda nombre de blob en la cadena de consulta (Java)HTTP trigger, look up blob name from query string (Java)

El ejemplo siguiente muestra una función de Java que usa la anotación HttpTrigger para recibir un parámetro que contiene el nombre de un archivo en un contenedor de Blob Storage.The following example shows a Java function that uses the HttpTrigger annotation to receive a parameter containing the name of a file in a blob storage container. Posteriormente, la anotación BlobInput lee el archivo y pasa el contenido a la función como byte[].The BlobInput annotation then reads the file and passes its contents to the function as a byte[].

  @FunctionName("getBlobSizeHttp")
  @StorageAccount("Storage_Account_Connection_String")
  public HttpResponseMessage blobSize(
    @HttpTrigger(name = "req", 
      methods = {HttpMethod.GET}, 
      authLevel = AuthorizationLevel.ANONYMOUS) 
    HttpRequestMessage<Optional<String>> request,
    @BlobInput(
      name = "file", 
      dataType = "binary", 
      path = "samples-workitems/{Query.file}") 
    byte[] content,
    final ExecutionContext context) {
      // build HTTP response with size of requested blob
      return request.createResponseBuilder(HttpStatus.OK)
        .body("The size of \"" + request.getQueryParameters().get("file") + "\" is: " + content.length + " bytes")
        .build();
  }

Desencadenador de cola, recepción del nombre del blob de la cola de mensajes (Java)Queue trigger, receive blob name from queue message (Java)

El ejemplo siguiente muestra una función de Java que usa la anotación QueueTrigger para recibir un mensaje que contiene el nombre de un archivo en un contenedor de Blob Storage.The following example shows a Java function that uses the QueueTrigger annotation to receive a message containing the name of a file in a blob storage container. Posteriormente, la anotación BlobInput lee el archivo y pasa el contenido a la función como byte[].The BlobInput annotation then reads the file and passes its contents to the function as a byte[].

  @FunctionName("getBlobSize")
  @StorageAccount("Storage_Account_Connection_String")
  public void blobSize(
    @QueueTrigger(
      name = "filename", 
      queueName = "myqueue-items-sample") 
    String filename,
    @BlobInput(
      name = "file", 
      dataType = "binary", 
      path = "samples-workitems/{queueTrigger}") 
    byte[] content,
    final ExecutionContext context) {
      context.getLogger().info("The size of \"" + filename + "\" is: " + content.length + " bytes");
  }

En la biblioteca en tiempo de ejecución de funciones de Java, utilice la anotación @BlobInput en los parámetros cuyo valor provendría de un blob.In the Java functions runtime library, use the @BlobInput annotation on parameters whose value would come from a blob. Esta anotación se puede usar con tipos nativos de Java, POJO o valores que aceptan valores NULL mediante Optional<T>.This annotation can be used with native Java types, POJOs, or nullable values using Optional<T>.

Entrada: atributosInput - attributes

En las bibliotecas de clase C#, use BlobAttribute.In C# class libraries, use the BlobAttribute.

El constructor del atributo toma la ruta de acceso al blob y un parámetro FileAccess que indica lectura o escritura, tal como se muestra en el ejemplo siguiente:The attribute's constructor takes the path to the blob and a FileAccess parameter indicating read or write, as shown in the following example:

[FunctionName("BlobInput")]
public static void Run(
    [QueueTrigger("myqueue-items")] string myQueueItem,
    [Blob("samples-workitems/{queueTrigger}", FileAccess.Read)] Stream myBlob,
    ILogger log)
{
    log.LogInformation($"BlobInput processed blob\n Name:{myQueueItem} \n Size: {myBlob.Length} bytes");
}

Puede establecer la propiedad Connection para especificar la cuenta de almacenamiento que se usará, tal como se muestra en el ejemplo siguiente:You can set the Connection property to specify the storage account to use, as shown in the following example:

[FunctionName("BlobInput")]
public static void Run(
    [QueueTrigger("myqueue-items")] string myQueueItem,
    [Blob("samples-workitems/{queueTrigger}", FileAccess.Read, Connection = "StorageConnectionAppSetting")] Stream myBlob,
    ILogger log)
{
    log.LogInformation($"BlobInput processed blob\n Name:{myQueueItem} \n Size: {myBlob.Length} bytes");
}

Puede usar el atributo StorageAccount para especificar la cuenta de almacenamiento en el nivel de clase, método o parámetro.You can use the StorageAccount attribute to specify the storage account at class, method, or parameter level. Para obtener más información, consulte Desencadenador: atributos.For more information, see Trigger - attributes.

Entrada: configuraciónInput - configuration

En la siguiente tabla se explican las propiedades de configuración de enlace que establece en el archivo function.json y el atributo Blob.The following table explains the binding configuration properties that you set in the function.json file and the Blob attribute.

Propiedad de function.jsonfunction.json property Propiedad de atributoAttribute property DESCRIPCIÓNDescription
typetype N/Dn/a Se debe establecer en blob.Must be set to blob.
directiondirection N/Dn/a Se debe establecer en in.Must be set to in. Las excepciones se indican en la sección uso.Exceptions are noted in the usage section.
namename N/Dn/a Nombre de la variable que representa el blob en el código de la función.The name of the variable that represents the blob in function code.
pathpath BlobPathBlobPath Ruta de acceso al blob.The path to the blob.
conexiónconnection ConnectionConnection El nombre de una configuración de aplicación que contiene la cadena de conexión de almacenamiento que se usará para este enlace.The name of an app setting that contains the Storage connection string to use for this binding. Si el nombre de la configuración de aplicación comienza con "AzureWebJobs", puede especificar solo el resto del nombre aquí.If the app setting name begins with "AzureWebJobs", you can specify only the remainder of the name here. Por ejemplo, si establece connection en "MyStorage", el entorno en tiempo de ejecución de Functions busca una configuración de aplicación denominada "AzureWebJobsMyStorage".For example, if you set connection to "MyStorage", the Functions runtime looks for an app setting that is named "AzureWebJobsMyStorage." Si deja connection vacía, el entorno en tiempo de ejecución de Functions utiliza la cadena de conexión de almacenamiento predeterminada en la configuración de aplicación que se denomina AzureWebJobsStorage.If you leave connection empty, the Functions runtime uses the default Storage connection string in the app setting that is named AzureWebJobsStorage.

La cadena de conexión debe ser para una cuenta de almacenamiento de uso general, no una cuenta de almacenamiento solo de blob.The connection string must be for a general-purpose storage account, not a blob-only storage account.
N/Dn/a AccederAccess Indica si va a leer o escribir.Indicates whether you will be reading or writing.

Cuando desarrolla localmente, la configuración de aplicación pasa al archivo local.settings.json.When you're developing locally, app settings go into the local.settings.json file.

Uso de entradasInput - usage

En C# y el script de C#, puede usar los tipos de parámetros siguientes para el enlace de entrada de blob:In C# and C# script, you can use the following parameter types for the blob input binding:

  • Stream
  • TextReader
  • string
  • Byte[]
  • CloudBlobContainer
  • CloudBlobDirectory
  • ICloudBlob1ICloudBlob1
  • CloudBlockBlob1CloudBlockBlob1
  • CloudPageBlob1CloudPageBlob1
  • CloudAppendBlob1CloudAppendBlob1

1 requiere un enlace "inout" direction en function.json o FileAccess.ReadWrite en una biblioteca de clases de C#.1 Requires "inout" binding direction in function.json or FileAccess.ReadWrite in a C# class library.

Si intenta enlazar a uno de los tipos de SDK de Storage y recibe un mensaje de error, asegúrese de que hace referencia a la versión de SDK de Storage correcta.If you try to bind to one of the Storage SDK types and get an error message, make sure that you have a reference to the correct Storage SDK version.

El enlace a string o Byte[] solo se recomienda si el tamaño de blob es pequeño, ya que todo el contenido del blob se carga en memoria.Binding to string or Byte[] is only recommended if the blob size is small, as the entire blob contents are loaded into memory. Por lo general, es preferible usar un tipo Stream o CloudBlockBlob.Generally, it is preferable to use a Stream or CloudBlockBlob type. Para más información, consulte Uso de simultaneidad y memoria que apareció anteriormente en este artículo.For more information, see Concurrency and memory usage earlier in this article.

En JavaScript, acceda a los datos de blob mediante context.bindings.<name from function.json>.In JavaScript, access the blob data using context.bindings.<name from function.json>.

OutputOutput

Use enlaces de salida de almacenamiento de blobs para escribir blobs.Use Blob storage output bindings to write blobs.

Salida: ejemploOutput - example

Vea el ejemplo específico del lenguaje:See the language-specific example:

Salida: ejemplo de C#Output - C# example

El ejemplo siguiente es una función de C# que utiliza un desencadenador de blobs y dos enlaces de blobs de salida.The following example is a C# function that uses a blob trigger and two output blob bindings. La función se activa por la creación de un blob de imágenes en el contenedor sample-images.The function is triggered by the creation of an image blob in the sample-images container. Crea copias pequeñas y medianas del blob de imágenes.It creates small and medium size copies of the image blob.

using System.Collections.Generic;
using System.IO;
using Microsoft.Azure.WebJobs;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;

[FunctionName("ResizeImage")]
public static void Run(
    [BlobTrigger("sample-images/{name}")] Stream image,
    [Blob("sample-images-sm/{name}", FileAccess.Write)] Stream imageSmall,
    [Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageMedium)
{
    IImageFormat format;

    using (Image<Rgba32> input = Image.Load(image, out format))
    {
      ResizeImage(input, imageSmall, ImageSize.Small, format);
    }

    image.Position = 0;
    using (Image<Rgba32> input = Image.Load(image, out format))
    {
      ResizeImage(input, imageMedium, ImageSize.Medium, format);
    }
}

public static void ResizeImage(Image<Rgba32> input, Stream output, ImageSize size, IImageFormat format)
{
    var dimensions = imageDimensionsTable[size];

    input.Mutate(x => x.Resize(dimensions.Item1, dimensions.Item2));
    input.Save(output, format);
}

public enum ImageSize { ExtraSmall, Small, Medium }

private static Dictionary<ImageSize, (int, int)> imageDimensionsTable = new Dictionary<ImageSize, (int, int)>() {
    { ImageSize.ExtraSmall, (320, 200) },
    { ImageSize.Small,      (640, 400) },
    { ImageSize.Medium,     (800, 600) }
};

Salida: ejemplo de script de C#Output - C# script example

En el ejemplo siguiente se muestran enlaces de entrada y salida de blobs en un archivo function.json y código de script de C# (.csx) que usa los enlaces.The following example shows blob input and output bindings in a function.json file and C# script (.csx) code that uses the bindings. La función realiza una copia de un blob de texto.The function makes a copy of a text blob. La función se activa mediante un mensaje de cola que contiene el nombre del blob que se va a copiar.The function is triggered by a queue message that contains the name of the blob to copy. El nuevo blob se denomina {nombreoriginaldelblob}-Copy.The new blob is named {originalblobname}-Copy.

En el archivo function.json, la propiedad de metadatos queueTrigger se utiliza para especificar el nombre del blob en las propiedades de path:In the function.json file, the queueTrigger metadata property is used to specify the blob name in the path properties:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "myOutputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}-Copy",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false
}

En la sección de configuración se explican estas propiedades.The configuration section explains these properties.

Este es el código de script de C#:Here's the C# script code:

public static void Run(string myQueueItem, string myInputBlob, out string myOutputBlob, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    myOutputBlob = myInputBlob;
}

Salida: ejemplo de JavaScriptOutput - JavaScript example

En el ejemplo siguiente se muestran enlaces de entrada y salida de blobs en un archivo function.json y código de script de JavaScript que usa los enlaces.The following example shows blob input and output bindings in a function.json file and JavaScript code that uses the bindings. La función realiza una copia de un blob.The function makes a copy of a blob. La función se activa mediante un mensaje de cola que contiene el nombre del blob que se va a copiar.The function is triggered by a queue message that contains the name of the blob to copy. El nuevo blob se denomina {nombreoriginaldelblob}-Copy.The new blob is named {originalblobname}-Copy.

En el archivo function.json, la propiedad de metadatos queueTrigger se utiliza para especificar el nombre del blob en las propiedades de path:In the function.json file, the queueTrigger metadata property is used to specify the blob name in the path properties:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "myInputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "myOutputBlob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}-Copy",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false
}

En la sección de configuración se explican estas propiedades.The configuration section explains these properties.

Este es el código de JavaScript:Here's the JavaScript code:

module.exports = function(context) {
    context.log('Node.js Queue trigger function processed', context.bindings.myQueueItem);
    context.bindings.myOutputBlob = context.bindings.myInputBlob;
    context.done();
};

Salida: ejemplo de PythonOutput - Python example

En el ejemplo siguiente se muestran enlaces de entrada y salida de blobs en un archivo function.json y el código de Python que usa los enlaces.The following example shows blob input and output bindings in a function.json file and Python code that uses the bindings. La función realiza una copia de un blob.The function makes a copy of a blob. La función se activa mediante un mensaje de cola que contiene el nombre del blob que se va a copiar.The function is triggered by a queue message that contains the name of the blob to copy. El nuevo blob se denomina {nombreoriginaldelblob}-Copy.The new blob is named {originalblobname}-Copy.

En el archivo function.json, la propiedad de metadatos queueTrigger se utiliza para especificar el nombre del blob en las propiedades de path:In the function.json file, the queueTrigger metadata property is used to specify the blob name in the path properties:

{
  "bindings": [
    {
      "queueName": "myqueue-items",
      "connection": "MyStorageConnectionAppSetting",
      "name": "queuemsg",
      "type": "queueTrigger",
      "direction": "in"
    },
    {
      "name": "inputblob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "in"
    },
    {
      "name": "outputblob",
      "type": "blob",
      "path": "samples-workitems/{queueTrigger}-Copy",
      "connection": "MyStorageConnectionAppSetting",
      "direction": "out"
    }
  ],
  "disabled": false,
  "scriptFile": "__init__.py"
}

En la sección de configuración se explican estas propiedades.The configuration section explains these properties.

Este es el código de Python:Here's the Python code:

import logging
import azure.functions as func


def main(queuemsg: func.QueueMessage, inputblob: func.InputStream,
         outputblob: func.Out[func.InputStream]):
    logging.info('Python Queue trigger function processed %s', inputblob.name)
    outputblob.set(inputblob)

Salida: ejemplos de JavaOutput - Java examples

En esta sección se incluyen los ejemplos siguientes:This section contains the following examples:

Desencadenador HTTP, uso de OutputBinding (Java)HTTP trigger, using OutputBinding (Java)

El ejemplo siguiente muestra una función de Java que usa la anotación HttpTrigger para recibir un parámetro que contiene el nombre de un archivo en un contenedor de Blob Storage.The following example shows a Java function that uses the HttpTrigger annotation to receive a parameter containing the name of a file in a blob storage container. Posteriormente, la anotación BlobInput lee el archivo y pasa el contenido a la función como byte[].The BlobInput annotation then reads the file and passes its contents to the function as a byte[]. La anotación BlobOutput enlaza a OutputBinding outputItem. La función usa este posteriormente para escribir el contenido del blob de entrada en el contenedor de almacenamiento configurado.The BlobOutput annotation binds to OutputBinding outputItem, which is then used by the function to write the contents of the input blob to the configured storage container.

  @FunctionName("copyBlobHttp")
  @StorageAccount("Storage_Account_Connection_String")
  public HttpResponseMessage copyBlobHttp(
    @HttpTrigger(name = "req", 
      methods = {HttpMethod.GET}, 
      authLevel = AuthorizationLevel.ANONYMOUS) 
    HttpRequestMessage<Optional<String>> request,
    @BlobInput(
      name = "file", 
      dataType = "binary", 
      path = "samples-workitems/{Query.file}") 
    byte[] content,
    @BlobOutput(
      name = "target", 
      path = "myblob/{Query.file}-CopyViaHttp")
    OutputBinding<String> outputItem,
    final ExecutionContext context) {
      // Save blob to outputItem
      outputItem.setValue(new String(content, StandardCharsets.UTF_8));

      // build HTTP response with size of requested blob
      return request.createResponseBuilder(HttpStatus.OK)
        .body("The size of \"" + request.getQueryParameters().get("file") + "\" is: " + content.length + " bytes")
        .build();
  }

Desencadenador de cola, uso del valor devuelto de la función (Java)Queue trigger, using function return value (Java)

El ejemplo siguiente muestra una función de Java que usa la anotación QueueTrigger para recibir un mensaje que contiene el nombre de un archivo en un contenedor de Blob Storage.The following example shows a Java function that uses the QueueTrigger annotation to receive a message containing the name of a file in a blob storage container. Posteriormente, la anotación BlobInput lee el archivo y pasa el contenido a la función como byte[].The BlobInput annotation then reads the file and passes its contents to the function as a byte[]. La anotación BlobOutput enlaza al valor devuelto de la función. El entorno de ejecución usa este valor posteriormente para escribir el contenido del blob de entrada en el contenedor de almacenamiento configurado.The BlobOutput annotation binds to the function return value, which is then used by the runtime to write the contents of the input blob to the configured storage container.

  @FunctionName("copyBlobQueueTrigger")
  @StorageAccount("Storage_Account_Connection_String")
  @BlobOutput(
    name = "target", 
    path = "myblob/{queueTrigger}-Copy")
  public String copyBlobQueue(
    @QueueTrigger(
      name = "filename", 
      dataType = "string",
      queueName = "myqueue-items") 
    String filename,
    @BlobInput(
      name = "file", 
      path = "samples-workitems/{queueTrigger}") 
    String content,
    final ExecutionContext context) {
      context.getLogger().info("The content of \"" + filename + "\" is: " + content);
      return content;
  }

En la biblioteca en tiempo de ejecución de funciones de Java, utilice la anotación @BlobOutput en los parámetros de función cuyo valor se escribiría en un objeto del almacenamiento de blobs.In the Java functions runtime library, use the @BlobOutput annotation on function parameters whose value would be written to an object in blob storage. El parámetro type debe ser OutputBinding<T>, donde T es cualquier tipo nativo de Java o un POJO.The parameter type should be OutputBinding<T>, where T is any native Java type or a POJO.

Salida: atributosOutput - attributes

En las bibliotecas de clase C#, use BlobAttribute.In C# class libraries, use the BlobAttribute.

El constructor del atributo toma la ruta de acceso al blob y un parámetro FileAccess que indica lectura o escritura, tal como se muestra en el ejemplo siguiente:The attribute's constructor takes the path to the blob and a FileAccess parameter indicating read or write, as shown in the following example:

[FunctionName("ResizeImage")]
public static void Run(
    [BlobTrigger("sample-images/{name}")] Stream image,
    [Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageSmall)
{
    ...
}

Puede establecer la propiedad Connection para especificar la cuenta de almacenamiento que se usará, tal como se muestra en el ejemplo siguiente:You can set the Connection property to specify the storage account to use, as shown in the following example:

[FunctionName("ResizeImage")]
public static void Run(
    [BlobTrigger("sample-images/{name}")] Stream image,
    [Blob("sample-images-md/{name}", FileAccess.Write, Connection = "StorageConnectionAppSetting")] Stream imageSmall)
{
    ...
}

Para obtener un ejemplo completo, consulte Salida: ejemplo de C#.For a complete example, see Output - C# example.

Puede usar el atributo StorageAccount para especificar la cuenta de almacenamiento en el nivel de clase, método o parámetro.You can use the StorageAccount attribute to specify the storage account at class, method, or parameter level. Para obtener más información, consulte Desencadenador: atributos.For more information, see Trigger - attributes.

Salida: configuraciónOutput - configuration

En la siguiente tabla se explican las propiedades de configuración de enlace que se definen en el archivo function.json y el atributo Blob.The following table explains the binding configuration properties that you set in the function.json file and the Blob attribute.

Propiedad de function.jsonfunction.json property Propiedad de atributoAttribute property DESCRIPCIÓNDescription
typetype N/Dn/a Se debe establecer en blob.Must be set to blob.
directiondirection N/Dn/a Debe establecerse en out para un enlace de salida.Must be set to out for an output binding. Las excepciones se indican en la sección uso.Exceptions are noted in the usage section.
namename N/Dn/a Nombre de la variable que representa el blob en el código de la función.The name of the variable that represents the blob in function code. Se establece en $return para hacer referencia al valor devuelto de la función.Set to $return to reference the function return value.
pathpath BlobPathBlobPath Ruta de acceso al contenedor de blobs.The path to the blob container.
conexiónconnection ConnectionConnection El nombre de una configuración de aplicación que contiene la cadena de conexión de almacenamiento que se usará para este enlace.The name of an app setting that contains the Storage connection string to use for this binding. Si el nombre de la configuración de aplicación comienza con "AzureWebJobs", puede especificar solo el resto del nombre aquí.If the app setting name begins with "AzureWebJobs", you can specify only the remainder of the name here. Por ejemplo, si establece connection en "MyStorage", el entorno en tiempo de ejecución de Functions busca una configuración de aplicación denominada "AzureWebJobsMyStorage".For example, if you set connection to "MyStorage", the Functions runtime looks for an app setting that is named "AzureWebJobsMyStorage." Si deja connection vacía, el entorno en tiempo de ejecución de Functions utiliza la cadena de conexión de almacenamiento predeterminada en la configuración de aplicación que se denomina AzureWebJobsStorage.If you leave connection empty, the Functions runtime uses the default Storage connection string in the app setting that is named AzureWebJobsStorage.

La cadena de conexión debe ser para una cuenta de almacenamiento de uso general, no una cuenta de almacenamiento solo de blob.The connection string must be for a general-purpose storage account, not a blob-only storage account.
N/Dn/a AccederAccess Indica si va a leer o escribir.Indicates whether you will be reading or writing.

Cuando desarrolla localmente, la configuración de aplicación pasa al archivo local.settings.json.When you're developing locally, app settings go into the local.settings.json file.

Uso de salidasOutput - usage

En C# y script de C#, puede enlazar con los tipos siguientes para la escritura de blobs:In C# and C# script, you can bind to the following types to write blobs:

  • TextWriter
  • out string
  • out Byte[]
  • CloudBlobStream
  • Stream
  • CloudBlobContainer1CloudBlobContainer1
  • CloudBlobDirectory
  • ICloudBlob2ICloudBlob2
  • CloudBlockBlob2CloudBlockBlob2
  • CloudPageBlob2CloudPageBlob2
  • CloudAppendBlob2CloudAppendBlob2

1 requiere un enlace "in" direction en function.json o FileAccess.Read en una biblioteca de clases de C#.1 Requires "in" binding direction in function.json or FileAccess.Read in a C# class library. Sin embargo, puede usar el objeto de contenedor que proporciona el tiempo de ejecución para escribir operaciones, como cargar blobs en el contenedor.However, you can use the container object that the runtime provides to do write operations, such as uploading blobs to the container.

2 requiere un enlace "inout" direction en function.json o FileAccess.ReadWrite en una biblioteca de clases de C#.2 Requires "inout" binding direction in function.json or FileAccess.ReadWrite in a C# class library.

Si intenta enlazar a uno de los tipos de SDK de Storage y recibe un mensaje de error, asegúrese de que hace referencia a la versión de SDK de Storage correcta.If you try to bind to one of the Storage SDK types and get an error message, make sure that you have a reference to the correct Storage SDK version.

En las funciones asincrónicas, use el valor devuelto o IAsyncCollector en lugar de un parámetro out.In async functions, use the return value or IAsyncCollector instead of an out parameter.

El enlace a string o Byte[] solo se recomienda si el tamaño de blob es pequeño, ya que todo el contenido del blob se carga en memoria.Binding to string or Byte[] is only recommended if the blob size is small, as the entire blob contents are loaded into memory. Por lo general, es preferible usar un tipo Stream o CloudBlockBlob.Generally, it is preferable to use a Stream or CloudBlockBlob type. Para más información, consulte Uso de simultaneidad y memoria que apareció anteriormente en este artículo.For more information, see Concurrency and memory usage earlier in this article.

En JavaScript, acceda a los datos de blob mediante context.bindings.<name from function.json>.In JavaScript, access the blob data using context.bindings.<name from function.json>.

Excepciones y códigos de retornoExceptions and return codes

EnlaceBinding ReferenciaReference
BlobBlob Códigos de error de blobsBlob Error Codes
Blob, tabla, colaBlob, Table, Queue Códigos de error de almacenamientoStorage Error Codes
Blob, tabla, colaBlob, Table, Queue Solución de problemasTroubleshooting

Pasos siguientesNext steps