Importar y exportar datos DICOM mediante Cloud Storage

En esta página se explica cómo exportar instancias DICOM e importar objetos DICOM desde Cloud Storage. Por lo general, una instancia DICOM es una imagen. Sin embargo, también puede referirse a otros tipos de datos persistentes, como un informe estructurado. Un objeto DICOM de Cloud Storage es una instancia DICOM que se encuentra en Cloud Storage. Para obtener más información, consulta Cloud Storage.

Configurar permisos de Cloud Storage

Antes de exportar datos DICOM a Cloud Storage e importarlos desde este servicio, debes conceder permisos adicionales a la cuenta de servicio del agente de servicio de Cloud Healthcare. Para obtener más información, consulta Permisos de Cloud Storage para almacenes DICOM.

Importar objetos DICOM

Para importar varios archivos de instancia DICOM a un almacén DICOM, puedes usar cualquiera de los siguientes métodos:

En los ejemplos siguientes se muestra cómo importar objetos DICOM desde un segmento de Cloud Storage.

Consola

Para importar objetos DICOM desde un segmento de Cloud Storage, sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Conjuntos de datos.
    Ir a conjuntos de datos
  2. Haga clic en el conjunto de datos que contenga el almacén DICOM al que quiera importar objetos DICOM.
  3. En la lista de almacenes de datos, elige Importar de la lista Acciones del almacén DICOM.

    Aparecerá la página Importar a almacén DICOM.
  4. En la lista Proyecto, selecciona un proyecto de Cloud Storage.
  5. En la lista Ubicación, selecciona un segmento de Cloud Storage.
  6. Para definir una ubicación específica para importar archivos, sigue estos pasos:
    1. Despliega Opciones avanzadas.
    2. Selecciona Reemplazar ruta de Cloud Storage.
    3. Para definir una fuente específica para importar archivos, define la ruta con las siguientes variables en el cuadro de texto Ubicación:
      • *: coincide con caracteres que no sean separadores.
      • **: busca coincidencias de caracteres, incluidos los separadores. Se puede usar con una extensión de nombre de archivo para que coincida con todos los archivos del mismo tipo.
      • ?: coincide con 1 carácter.
  7. Haz clic en Importar para importar objetos DICOM de la fuente definida.
  8. Para hacer un seguimiento del estado de la operación, haga clic en la pestaña Operaciones. Una vez que se haya completado la operación, aparecerán las siguientes indicaciones:
    • La sección Estado de la operación de larga duración tiene una marca de verificación verde en el encabezado OK.
    • La sección Resumen tiene una marca de verificación verde y un indicador OK en la misma fila que el ID de operación.
    Si se produce algún error, haz clic en Acciones y, a continuación, en Ver detalles en Cloud Logging.

gcloud

Para importar objetos DICOM desde un segmento de Cloud Storage, usa el comando gcloud healthcare dicom-stores import gcs. Especifica el nombre del conjunto de datos superior, el nombre del almacén DICOM y la ubicación del objeto en un segmento de Cloud Storage.

  • La ubicación de los archivos dentro del segmento es arbitraria y no tiene por qué coincidir exactamente con el formato especificado en el siguiente ejemplo.
  • Al especificar la ubicación de los objetos DICOM en Cloud Storage, puedes utilizar comodines para importar varios archivos desde uno o más directorios. Se admiten los siguientes comodines:
    • Usa * para hacer coincidir 0 o más caracteres que no sean de separación. Por ejemplo, gs://BUCKET/DIRECTORY/Example*.dcm coincide con Example.dcm y Example22.dcm en DIRECTORY.
    • Usa ** para hacer coincidir 0 o más caracteres (incluidos los de separación). Se debe usar al final de una ruta y no debe haber otros comodines en la ruta. También se puede usar con una extensión de nombre de archivo (como .dcm), que importa todos los archivos con la extensión de nombre de archivo del directorio especificado y sus subdirectorios. Por ejemplo, gs://BUCKET/DIRECTORY/**.dcm importa todos los archivos con la extensión .dcm en DIRECTORY y sus subdirectorios.
    • Usa ? para hacer que coincida 1 carácter. Por ejemplo, gs://BUCKET/DIRECTORY/Example?.dcm coincide con Example1.dcm, pero no con Example.dcm ni con Example01.dcm.

En el siguiente ejemplo se muestra cómo importar objetos DICOM desde un segmento de Cloud Storage.

gcloud healthcare dicom-stores import gcs DICOM_STORE_ID \
  --dataset=DATASET_ID \
  --location=LOCATION \
  --gcs-uri=gs://BUCKET/DIRECTORY/DICOM_INSTANCE.dcm

La línea de comandos muestra el ID de la operación:

name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID

Para ver el estado de la operación, ejecuta el comando gcloud healthcare operations describe y proporciona OPERATION_ID de la respuesta:

gcloud healthcare operations describe OPERATION_ID \
  --location=LOCATION \
  --dataset=DATASET_ID

Una vez que se haya completado el comando, la respuesta incluirá done: true.

done: true
metadata:
'@type': type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata
apiMethodName: google.cloud.healthcare.v1.dicom.DicomService.ImportDicomData
counter:
  success: SUCCESSFUL_INSTANCES
  failure: FAILED_INSTANCES
createTime: "CREATE_TIME"
endTime: "END_TIME"
name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID
response:
'@type': "..."

API

Para importar objetos DICOM desde un segmento de Cloud Storage, usa el método projects.locations.datasets.dicomStores.import.

  • La ubicación de los archivos dentro del segmento puede variar y no tiene por qué coincidir con el formato especificado en los siguientes ejemplos.
  • Al especificar la ubicación de los objetos DICOM en Cloud Storage, utiliza comodines para importar varios archivos desde uno o más directorios. Se admiten los siguientes comodines:
    • Usa * para hacer coincidir 0 o más caracteres que no sean de separación. Por ejemplo, gs://BUCKET/DIRECTORY/Example*.dcm coincide con Example.dcm y Example22.dcm en DIRECTORY.
    • Usa ** para hacer coincidir 0 o más caracteres (incluidos los de separación). Se debe usar al final de una ruta y no debe haber otros comodines en la ruta. También se puede usar con una extensión de nombre de archivo (como .dcm), que importa todos los archivos con la extensión de nombre de archivo del directorio especificado y sus subdirectorios. Por ejemplo, gs://BUCKET/DIRECTORY/**.dcm importa todos los archivos con la extensión .dcm en DIRECTORY y sus subdirectorios.
    • Usa ? para hacer que coincida 1 carácter. Por ejemplo, gs://BUCKET/DIRECTORY/Example?.dcm coincide con Example1.dcm, pero no con Example.dcm ni con Example01.dcm.

REST

  1. Importa el objeto DICOM.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: el ID de tu Google Cloud proyecto
    • LOCATION: la ubicación del conjunto de datos
    • DATASET_ID: el conjunto de datos superior del almacén DICOM
    • DICOM_STORE_ID: el ID del almacén DICOM
    • BUCKET/PATH/TO/FILE: la ruta al objeto DICOM en Cloud Storage

    Cuerpo JSON de la solicitud:

    {
      "gcsSource": {
        "uri": "gs://BUCKET/PATH/TO/FILE.dcm"
      }
    }
    

    Para enviar tu solicitud, elige una de estas opciones:

    curl

    Guarda el cuerpo de la solicitud en un archivo llamado request.json. Ejecuta el siguiente comando en el terminal para crear o sobrescribir este archivo en el directorio actual:

    cat > request.json << 'EOF'
    {
      "gcsSource": {
        "uri": "gs://BUCKET/PATH/TO/FILE.dcm"
      }
    }
    EOF

    A continuación, ejecuta el siguiente comando para enviar tu solicitud REST:

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID:import"

    PowerShell

    Guarda el cuerpo de la solicitud en un archivo llamado request.json. Ejecuta el siguiente comando en el terminal para crear o sobrescribir este archivo en el directorio actual:

    @'
    {
      "gcsSource": {
        "uri": "gs://BUCKET/PATH/TO/FILE.dcm"
      }
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    A continuación, ejecuta el siguiente comando para enviar tu solicitud REST:

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID:import" | Select-Object -Expand Content
    El resultado es el siguiente. La respuesta contiene un identificador de una operación de larga duración. Las operaciones de larga duración se devuelven cuando las llamadas a métodos pueden tardar mucho tiempo en completarse. Anota el valor de OPERATION_ID. Necesitarás este valor en el siguiente paso.

  2. Obtén el estado de la operación de larga duración.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: el ID de tu Google Cloud proyecto
    • LOCATION: la ubicación del conjunto de datos
    • DATASET_ID: el conjunto de datos superior del almacén DICOM
    • OPERATION_ID: el ID devuelto por la operación de larga duración

    Para enviar tu solicitud, elige una de estas opciones:

    curl

    Ejecuta el comando siguiente:

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    Ejecuta el comando siguiente:

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content
    Si la operación de larga duración sigue en curso, el servidor devuelve una respuesta con el número de instancias DICOM pendientes de importación. Cuando la operación de larga duración finaliza correctamente, el servidor devuelve una respuesta con el estado de la operación en formato JSON:

Go

import (
	"context"
	"fmt"
	"io"

	healthcare "google.golang.org/api/healthcare/v1"
)

// importDICOMInstance imports DICOM objects from GCS.
func importDICOMInstance(w io.Writer, projectID, location, datasetID, dicomStoreID, contentURI string) error {
	ctx := context.Background()

	healthcareService, err := healthcare.NewService(ctx)
	if err != nil {
		return fmt.Errorf("healthcare.NewService: %w", err)
	}

	storesService := healthcareService.Projects.Locations.Datasets.DicomStores

	req := &healthcare.ImportDicomDataRequest{
		GcsSource: &healthcare.GoogleCloudHealthcareV1DicomGcsSource{
			Uri: contentURI,
		},
	}
	name := fmt.Sprintf("projects/%s/locations/%s/datasets/%s/dicomStores/%s", projectID, location, datasetID, dicomStoreID)

	lro, err := storesService.Import(name, req).Do()
	if err != nil {
		return fmt.Errorf("Import: %w", err)
	}

	fmt.Fprintf(w, "Import to DICOM store started. Operation: %q\n", lro.Name)
	return nil
}

Java

import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.healthcare.v1.CloudHealthcare;
import com.google.api.services.healthcare.v1.CloudHealthcare.Projects.Locations.Datasets.DicomStores;
import com.google.api.services.healthcare.v1.CloudHealthcareScopes;
import com.google.api.services.healthcare.v1.model.GoogleCloudHealthcareV1DicomGcsSource;
import com.google.api.services.healthcare.v1.model.ImportDicomDataRequest;
import com.google.api.services.healthcare.v1.model.Operation;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Collections;

public class DicomStoreImport {
  private static final String DICOM_NAME = "projects/%s/locations/%s/datasets/%s/dicomStores/%s";
  private static final JsonFactory JSON_FACTORY = new GsonFactory();
  private static final NetHttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  public static void dicomStoreImport(String dicomStoreName, String gcsUri) throws IOException {
    // String dicomStoreName =
    //    String.format(
    //        DICOM_NAME, "your-project-id", "your-region-id", "your-dataset-id", "your-dicom-id");
    // String gcsUri = "gs://your-bucket-id/path/to/destination/dir"

    // Initialize the client, which will be used to interact with the service.
    CloudHealthcare client = createClient();

    // Configure where the store should be imported from.
    GoogleCloudHealthcareV1DicomGcsSource gcsSource =
        new GoogleCloudHealthcareV1DicomGcsSource().setUri(gcsUri);
    ImportDicomDataRequest importRequest = new ImportDicomDataRequest().setGcsSource(gcsSource);

    // Create request and configure any parameters.
    DicomStores.CloudHealthcareImport request =
        client
            .projects()
            .locations()
            .datasets()
            .dicomStores()
            .healthcareImport(dicomStoreName, importRequest);

    // Execute the request, wait for the operation to complete, and process the results.
    try {
      Operation operation = request.execute();
      while (operation.getDone() == null || !operation.getDone()) {
        // Update the status of the operation with another request.
        Thread.sleep(500); // Pause for 500ms between requests.
        operation =
            client
                .projects()
                .locations()
                .datasets()
                .operations()
                .get(operation.getName())
                .execute();
      }
      System.out.println("DICOM store import complete." + operation.getResponse());
    } catch (Exception ex) {
      System.out.printf("Error during request execution: %s", ex.toString());
      ex.printStackTrace(System.out);
    }
  }

  private static CloudHealthcare createClient() throws IOException {
    // Use Application Default Credentials (ADC) to authenticate the requests
    // For more information see https://cloud.google.com/docs/authentication/production
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(CloudHealthcareScopes.CLOUD_PLATFORM));

    // Create a HttpRequestInitializer, which will provide a baseline configuration to all requests.
    HttpRequestInitializer requestInitializer =
        request -> {
          new HttpCredentialsAdapter(credential).initialize(request);
          request.setConnectTimeout(60000); // 1 minute connect timeout
          request.setReadTimeout(60000); // 1 minute read timeout
        };

    // Build the client for interacting with the service.
    return new CloudHealthcare.Builder(HTTP_TRANSPORT, JSON_FACTORY, requestInitializer)
        .setApplicationName("your-application-name")
        .build();
  }
}

Node.js

const google = require('@googleapis/healthcare');
const healthcare = google.healthcare({
  version: 'v1',
  auth: new google.auth.GoogleAuth({
    scopes: ['https://www.googleapis.com/auth/cloud-platform'],
  }),
});
const sleep = ms => {
  return new Promise(resolve => setTimeout(resolve, ms));
};

const importDicomInstance = async () => {
  // TODO(developer): uncomment these lines before running the sample
  // const cloudRegion = 'us-central1';
  // const projectId = 'adjective-noun-123';
  // const datasetId = 'my-dataset';
  // const dicomStoreId = 'my-dicom-store';
  // const gcsUri = 'my-bucket/my-directory/*.dcm'
  const name = `projects/${projectId}/locations/${cloudRegion}/datasets/${datasetId}/dicomStores/${dicomStoreId}`;
  const request = {
    name,
    resource: {
      // The location of the DICOM instances in Cloud Storage
      gcsSource: {
        uri: `gs://${gcsUri}`,
      },
    },
  };

  const operation =
    await healthcare.projects.locations.datasets.dicomStores.import(request);
  const operationName = operation.data.name;

  const operationRequest = {name: operationName};

  // Wait fifteen seconds for the LRO to finish.
  await sleep(15000);

  // Check the LRO's status
  const operationStatus =
    await healthcare.projects.locations.datasets.operations.get(
      operationRequest
    );

  const {data} = operationStatus;

  if (data.error === undefined) {
    console.log('Successfully imported DICOM instances');
  } else {
    console.log('Encountered errors. Sample error:');
    console.log(
      'Resource on which error occured:',
      data.error.details[0]['sampleErrors'][0]['resource']
    );
    console.log(
      'Error code:',
      data.error.details[0]['sampleErrors'][0]['error']['code']
    );
    console.log(
      'Error message:',
      data.error.details[0]['sampleErrors'][0]['error']['message']
    );
  }
};

importDicomInstance();

Python

def import_dicom_instance(
    project_id, location, dataset_id, dicom_store_id, content_uri
):
    """Imports data into the DICOM store by copying it from the specified
    source.

    See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/dicom
    before running the sample."""
    # Imports the Google API Discovery Service.
    from googleapiclient import discovery

    api_version = "v1"
    service_name = "healthcare"
    # Returns an authorized API client by discovering the Healthcare API
    # and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
    client = discovery.build(service_name, api_version)

    # TODO(developer): Uncomment these lines and replace with your values.
    # project_id = 'my-project'  # replace with your GCP project ID
    # location = 'us-central1'  # replace with the parent dataset's location
    # dataset_id = 'my-dataset'  # replace with the DICOM store's parent dataset ID
    # dicom_store_id = 'my-dicom-store'  # replace with the DICOM store's ID
    # content_uri = 'my-bucket/*.dcm'  # replace with a Cloud Storage bucket and DCM files
    dicom_store_parent = "projects/{}/locations/{}/datasets/{}".format(
        project_id, location, dataset_id
    )
    dicom_store_name = f"{dicom_store_parent}/dicomStores/{dicom_store_id}"

    body = {"gcsSource": {"uri": f"gs://{content_uri}"}}

    # Escape "import()" method keyword because "import"
    # is a reserved keyword in Python
    request = (
        client.projects()
        .locations()
        .datasets()
        .dicomStores()
        .import_(name=dicom_store_name, body=body)
    )

    response = request.execute()
    print(f"Imported DICOM instance: {content_uri}")

    return response

Para recuperar una sola instancia o un estudio de un almacén DICOM, recupera datos DICOM mediante el servicio web RESTful Retrieve Transaction (Recuperar transacción) implementado en la API Cloud Healthcare.

Especificar una clase de almacenamiento para importar objetos DICOM (vista previa)

De forma predeterminada, el método projects.locations.datasets.dicomStores.import importa un objeto DICOM a un almacén DICOM con una clase de almacenamiento estándar. Puedes definir la clase de almacenamiento al importar objetos DICOM desde Cloud Storage. Para obtener más información, consulta Cambiar la clase de almacenamiento de DICOM.

En los ejemplos siguientes se muestra cómo especificar la clase de almacenamiento al importar objetos DICOM desde Cloud Storage.

REST

Usa el método projects.locations.datasets.dicomStores.import.

  1. Importa el objeto DICOM.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: el ID de tu Google Cloud proyecto
    • LOCATION: la ubicación del conjunto de datos
    • DATASET_ID: el conjunto de datos superior del almacén DICOM
    • DICOM_STORE_ID: el ID del almacén DICOM
    • BUCKET/PATH/TO/FILE: la ruta al objeto DICOM en Cloud Storage
    • STORAGE_CLASS: la clase de almacenamiento del objeto DICOM en el almacén DICOM de STANDARD, NEARLINE, COLDLINE y ARCHIVE

    Cuerpo JSON de la solicitud:

    {
      "gcsSource": {
        "uri": "gs://BUCKET/PATH/TO/FILE.dcm"
      },
      "blob_storage_settings": {
        "blob_storage_class": "STORAGE_CLASS"
      }
    }
    

    Para enviar tu solicitud, elige una de estas opciones:

    curl

    Guarda el cuerpo de la solicitud en un archivo llamado request.json. Ejecuta el siguiente comando en el terminal para crear o sobrescribir este archivo en el directorio actual:

    cat > request.json << 'EOF'
    {
      "gcsSource": {
        "uri": "gs://BUCKET/PATH/TO/FILE.dcm"
      },
      "blob_storage_settings": {
        "blob_storage_class": "STORAGE_CLASS"
      }
    }
    EOF

    A continuación, ejecuta el siguiente comando para enviar tu solicitud REST:

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID:import"

    PowerShell

    Guarda el cuerpo de la solicitud en un archivo llamado request.json. Ejecuta el siguiente comando en el terminal para crear o sobrescribir este archivo en el directorio actual:

    @'
    {
      "gcsSource": {
        "uri": "gs://BUCKET/PATH/TO/FILE.dcm"
      },
      "blob_storage_settings": {
        "blob_storage_class": "STORAGE_CLASS"
      }
    }
    '@  | Out-File -FilePath request.json -Encoding utf8

    A continuación, ejecuta el siguiente comando para enviar tu solicitud REST:

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method POST `
    -Headers $headers `
    -ContentType: "application/json" `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID:import" | Select-Object -Expand Content
    El resultado es el siguiente. La respuesta contiene un identificador de una operación de larga duración. Las operaciones de larga duración se devuelven cuando las llamadas a métodos pueden tardar mucho tiempo en completarse. Anota el valor de OPERATION_ID. Necesitarás este valor en el siguiente paso.

  2. Obtén el estado de la operación de larga duración.

    Antes de usar los datos de la solicitud, haz las siguientes sustituciones:

    • PROJECT_ID: el ID de tu Google Cloud proyecto
    • LOCATION: la ubicación del conjunto de datos
    • DATASET_ID: el conjunto de datos superior del almacén DICOM
    • OPERATION_ID: el ID devuelto por la operación de larga duración

    Para enviar tu solicitud, elige una de estas opciones:

    curl

    Ejecuta el comando siguiente:

    curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

    PowerShell

    Ejecuta el comando siguiente:

    $cred = gcloud auth print-access-token
    $headers = @{ "Authorization" = "Bearer $cred" }

    Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content
    Si la operación de larga duración sigue en curso, el servidor devuelve una respuesta con el número de instancias DICOM pendientes de importación. Cuando finaliza la operación de larga duración, el servidor devuelve una respuesta con el estado de la operación en formato JSON:

Solucionar problemas con solicitudes de importación de DICOM

Si se producen errores durante una solicitud de importación de DICOM, se registran en Cloud Logging. Para obtener más información, consulta Ver registros de errores en Cloud Logging.

Exportar instancias DICOM

En los ejemplos siguientes se muestra cómo exportar instancias DICOM a un segmento de Cloud Storage. Al exportar instancias DICOM desde un almacén DICOM, se exportan todas las instancias que se encuentran en el almacén.

Consola

Para exportar instancias DICOM a Cloud Storage, sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Conjuntos de datos.
    Ir a conjuntos de datos
  2. Haga clic en el conjunto de datos que contiene el almacén DICOM del que quiere exportar instancias DICOM.
  3. En la lista de almacenes de datos, elija Exportar en la lista Acciones del almacén DICOM.
  4. En la página Exportar almacén DICOM que aparece, selecciona Segmento de Google Cloud Storage.
  5. En la lista Proyecto, selecciona un proyecto de Cloud Storage.
  6. En la lista Ubicación, selecciona un segmento de Cloud Storage.
  7. En Configuración de exportación de DICOM, selecciona el tipo de archivo que se usará para exportar las instancias DICOM. Están disponibles los siguientes tipos:
    • Archivo DICOM (.dcm)
    • octet-stream
    • Imagen (.jpg, .png)
  8. Para definir una sintaxis de transferencia adicional, elija la sintaxis en la lista Sintaxis de transferencia.
  9. Haz clic en Exportar para exportar las instancias DICOM a la ubicación definida en Cloud Storage.
  10. Para hacer un seguimiento del estado de la operación, haga clic en la pestaña Operaciones. Una vez que se haya completado la operación, aparecerán las siguientes indicaciones:
    • La sección Estado de la operación de larga duración tiene una marca de verificación verde en el encabezado OK.
    • La sección Resumen tiene una marca de verificación verde y un indicador OK en la misma fila que el ID de operación.
    Si se produce algún error, haz clic en Acciones y, a continuación, en Ver detalles en Cloud Logging.

gcloud

Para exportar instancias DICOM a un segmento de Cloud Storage, usa el comando gcloud healthcare dicom-stores export gcs.

  • Proporciona el nombre del conjunto de datos superior, el nombre del almacén DICOM y el segmento de Cloud Storage de destino.
  • Escribe en un segmento o directorio de Cloud Storage en lugar de en un objeto, ya que la API Cloud Healthcare crea un archivo .dcm por cada objeto.
  • Si el comando especifica un directorio que no existe, se crea.

En el siguiente ejemplo se muestra el comando gcloud healthcare dicom-stores export gcs.

gcloud healthcare dicom-stores export gcs DICOM_STORE_ID \
  --dataset=DATASET_ID \
  --location=LOCATION \
  --gcs-uri-prefix=gs://BUCKET/DIRECTORY

La línea de comandos muestra el ID de la operación:

name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID

Para ver el estado de la operación, ejecuta el comando gcloud healthcare operations describe y proporciona OPERATION_ID de la respuesta:

gcloud healthcare operations describe OPERATION_ID \
  --location=LOCATION \
  --dataset=DATASET_ID

Una vez que se haya completado el comando, la respuesta incluirá done: true.

done: true
metadata:
'@type': type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata
apiMethodName: google.cloud.healthcare.v1.dicom.DicomService.ExportDicomData
counter:
  success: SUCCESSFUL_INSTANCES
  failure: FAILED_INSTANCES
createTime: "CREATE_TIME"
endTime: "END_TIME"
name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID
response:
'@type': "..."

API

Para exportar instancias DICOM a un segmento de Cloud Storage, usa el método projects.locations.datasets.dicomStores.export.

  • Escribe en un segmento o directorio de Cloud Storage en lugar de en un objeto, ya que la API Cloud Healthcare crea un archivo .dcm por cada objeto DICOM.
  • Si el comando especifica un directorio que no existe, se crea.

curl

Para exportar instancias DICOM, haz una solicitud POST y proporciona la siguiente información:

  • Nombre y ubicación del conjunto de datos principal
  • Nombre del almacén DICOM
  • El segmento de destino de Cloud Storage

En el siguiente ejemplo se muestra una solicitud POST que utiliza curl.

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    --data "{
      'gcsDestination': {
        'uriPrefix': 'gs://BUCKET/DIRECTORY'
      }
    }" "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID:export"

Si la solicitud se realiza de forma correcta, el servidor devuelve la respuesta en formato JSON:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

La respuesta contiene un nombre de operación. Para hacer un seguimiento del estado de la operación, utiliza el método Operation get:

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"

Si la solicitud se realiza de forma correcta, el servidor devuelve una respuesta con el estado de la operación en formato JSON:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1.dicom.DicomService.ExportDicomData",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL",
    "counter":{
       "success": SUCCESSFUL_INSTANCES
       "failure": FAILED_INSTANCES
    }
  },
  "done": true,
  "response": {
    "@type": "..."
  }
}

PowerShell

Para exportar instancias DICOM, haz una solicitud POST y proporciona la siguiente información:

  • Nombre y ubicación del conjunto de datos principal
  • Nombre del almacén DICOM
  • El segmento de destino de Cloud Storage

En el siguiente ejemplo se muestra una solicitud POST que utiliza Windows PowerShell.

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred" }

Invoke-WebRequest `
  -Method Post `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body "{
    'gcsDestination': {
      'uriPrefix': 'gs://BUCKET/DIRECTORY'
    }
  }" `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID:export" | Select-Object -Expand Content

Si la solicitud se realiza de forma correcta, el servidor devuelve la respuesta en formato JSON:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"
}

La respuesta contiene un nombre de operación. Para hacer un seguimiento del estado de la operación, utiliza el método Operation get:

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred" }

Invoke-WebRequest `
  -Method Get `
  -Headers $headers `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand Content

Si la solicitud se realiza de forma correcta, el servidor devuelve una respuesta con el estado de la operación en formato JSON:

{
  "name": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1.dicom.DicomService.ExportDicomData",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME",
    "logsUrl": "https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL",
    "counter":{
       "success": SUCCESSFUL_INSTANCES
       "failure": FAILED_INSTANCES
    },
  },
  "done": true,
  "response": {
    "@type": "..."
  }
}

Go

import (
	"context"
	"fmt"
	"io"

	healthcare "google.golang.org/api/healthcare/v1"
)

// exportDICOMInstance exports DICOM objects to GCS.
func exportDICOMInstance(w io.Writer, projectID, location, datasetID, dicomStoreID, destination string) error {
	ctx := context.Background()

	healthcareService, err := healthcare.NewService(ctx)
	if err != nil {
		return fmt.Errorf("healthcare.NewService: %w", err)
	}

	storesService := healthcareService.Projects.Locations.Datasets.DicomStores

	req := &healthcare.ExportDicomDataRequest{
		GcsDestination: &healthcare.GoogleCloudHealthcareV1DicomGcsDestination{
			UriPrefix: destination, // "gs://my-bucket/path/to/prefix/"
		},
	}
	name := fmt.Sprintf("projects/%s/locations/%s/datasets/%s/dicomStores/%s", projectID, location, datasetID, dicomStoreID)

	lro, err := storesService.Export(name, req).Do()
	if err != nil {
		return fmt.Errorf("Export: %w", err)
	}

	fmt.Fprintf(w, "Export to DICOM store started. Operation: %q\n", lro.Name)
	return nil
}

Java

import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.healthcare.v1.CloudHealthcare;
import com.google.api.services.healthcare.v1.CloudHealthcare.Projects.Locations.Datasets.DicomStores;
import com.google.api.services.healthcare.v1.CloudHealthcareScopes;
import com.google.api.services.healthcare.v1.model.ExportDicomDataRequest;
import com.google.api.services.healthcare.v1.model.GoogleCloudHealthcareV1DicomGcsDestination;
import com.google.api.services.healthcare.v1.model.Operation;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Collections;

public class DicomStoreExport {
  private static final String DICOM_NAME = "projects/%s/locations/%s/datasets/%s/dicomStores/%s";
  private static final JsonFactory JSON_FACTORY = new GsonFactory();
  private static final NetHttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  public static void dicomStoreExport(String dicomStoreName, String gcsUri) throws IOException {
    // String dicomStoreName =
    //    String.format(
    //        DICOM_NAME, "your-project-id", "your-region-id", "your-dataset-id", "your-dicom-id");
    // String gcsUri = "gs://your-bucket-id/path/to/destination/dir"

    // Initialize the client, which will be used to interact with the service.
    CloudHealthcare client = createClient();

    // Configure where the store will be exported too.
    GoogleCloudHealthcareV1DicomGcsDestination gcsDestination =
        new GoogleCloudHealthcareV1DicomGcsDestination().setUriPrefix(gcsUri);
    ExportDicomDataRequest exportRequest =
        new ExportDicomDataRequest().setGcsDestination(gcsDestination);

    // Create request and configure any parameters.
    DicomStores.Export request =
        client
            .projects()
            .locations()
            .datasets()
            .dicomStores()
            .export(dicomStoreName, exportRequest);

    // Execute the request, wait for the operation to complete, and process the results.
    try {
      Operation operation = request.execute();
      while (operation.getDone() == null || !operation.getDone()) {
        // Update the status of the operation with another request.
        Thread.sleep(500); // Pause for 500ms between requests.
        operation =
            client
                .projects()
                .locations()
                .datasets()
                .operations()
                .get(operation.getName())
                .execute();
      }
      System.out.println("DICOM store export complete." + operation.getResponse());
    } catch (Exception ex) {
      System.out.printf("Error during request execution: %s", ex.toString());
      ex.printStackTrace(System.out);
    }
  }

  private static CloudHealthcare createClient() throws IOException {
    // Use Application Default Credentials (ADC) to authenticate the requests
    // For more information see https://cloud.google.com/docs/authentication/production
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(CloudHealthcareScopes.CLOUD_PLATFORM));

    // Create a HttpRequestInitializer, which will provide a baseline configuration to all requests.
    HttpRequestInitializer requestInitializer =
        request -> {
          new HttpCredentialsAdapter(credential).initialize(request);
          request.setConnectTimeout(60000); // 1 minute connect timeout
          request.setReadTimeout(60000); // 1 minute read timeout
        };

    // Build the client for interacting with the service.
    return new CloudHealthcare.Builder(HTTP_TRANSPORT, JSON_FACTORY, requestInitializer)
        .setApplicationName("your-application-name")
        .build();
  }
}

Node.js

const google = require('@googleapis/healthcare');
const healthcare = google.healthcare({
  version: 'v1',
  auth: new google.auth.GoogleAuth({
    scopes: ['https://www.googleapis.com/auth/cloud-platform'],
  }),
});

const exportDicomInstanceGcs = async () => {
  // TODO(developer): uncomment these lines before running the sample
  // const cloudRegion = 'us-central1';
  // const projectId = 'adjective-noun-123';
  // const datasetId = 'my-dataset';
  // const dicomStoreId = 'my-dicom-store';
  // const gcsUri = 'my-bucket/my-directory'
  const name = `projects/${projectId}/locations/${cloudRegion}/datasets/${datasetId}/dicomStores/${dicomStoreId}`;
  const request = {
    name,
    resource: {
      gcsDestination: {
        // The destination location of the DICOM instances in Cloud Storage
        uriPrefix: `gs://${gcsUri}`,
        // The format to use for the output files, per the MIME types supported in the DICOM spec
        mimeType: 'application/dicom',
      },
    },
  };

  await healthcare.projects.locations.datasets.dicomStores.export(request);
  console.log(`Exported DICOM instances to ${gcsUri}`);
};

exportDicomInstanceGcs();

Python

def export_dicom_instance(project_id, location, dataset_id, dicom_store_id, uri_prefix):
    """Export data to a Google Cloud Storage bucket by copying
    it from the DICOM store.

    See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/dicom
    before running the sample."""
    # Imports the Google API Discovery Service.
    from googleapiclient import discovery

    api_version = "v1"
    service_name = "healthcare"
    # Returns an authorized API client by discovering the Healthcare API
    # and using GOOGLE_APPLICATION_CREDENTIALS environment variable.
    client = discovery.build(service_name, api_version)

    # TODO(developer): Uncomment these lines and replace with your values.
    # project_id = 'my-project'  # replace with your GCP project ID
    # location = 'us-central1'  # replace with the parent dataset's location
    # dataset_id = 'my-dataset'  # replace with the DICOM store's parent dataset ID
    # dicom_store_id = 'my-dicom-store'  # replace with the DICOM store's ID
    # uri_prefix = 'my-bucket'  # replace with a Cloud Storage bucket
    dicom_store_parent = "projects/{}/locations/{}/datasets/{}".format(
        project_id, location, dataset_id
    )
    dicom_store_name = f"{dicom_store_parent}/dicomStores/{dicom_store_id}"

    body = {"gcsDestination": {"uriPrefix": f"gs://{uri_prefix}"}}

    request = (
        client.projects()
        .locations()
        .datasets()
        .dicomStores()
        .export(name=dicom_store_name, body=body)
    )

    response = request.execute()
    print(f"Exported DICOM instances to bucket: gs://{uri_prefix}")

    return response

Exportar instancias DICOM mediante filtros

De forma predeterminada, al exportar archivos DICOM a Cloud Storage, se exportan todos los archivos DICOM del almacén DICOM. Del mismo modo, cuando exportas metadatos DICOM a BigQuery, se exportan los metadatos de todos los datos DICOM del almacén DICOM.

Puedes exportar un subconjunto de datos o metadatos DICOM mediante un archivo de filtro.

Configurar un archivo de filtro

  • Cada línea del archivo de filtro define el estudio, la serie o la instancia y usa el formato /studies/STUDY_INSTANCE_UID/series/SERIES_INSTANCE_UID/instances/INSTANCE_UID.
  • Puedes truncar una línea para especificar el nivel en el que funciona el filtro. Por ejemplo, puedes seleccionar un estudio completo especificando /studies/STUDY_INSTANCE_UID o una serie completa especificando /studies/STUDY_INSTANCE_UID/series/SERIES_INSTANCE_UID.

Considera el siguiente archivo de filtro:

/studies/1.123.456.789
/studies/1.666.333.111/series/123.456
/studies/1.666.333.111/series/567.890
/studies/1.888.999.222/series/123.456/instances/111
/studies/1.888.999.222/series/123.456/instances/222
/studies/1.888.999.222/series/123.456/instances/333

Este archivo de filtro de ejemplo se aplica a lo siguiente:

  • Todo el estudio con el UID de instancia de estudio 1.123.456.789
  • Dos series independientes con los UIDs de instancia de serie 123.456 y 567.890 en el estudio 1.666.333.111
  • Tres instancias individuales con los IDs de instancia 111, 222 y 333 en el estudio 1.888.999.222 y la serie 123.456

Crear un archivo de filtro con BigQuery

Para crear un archivo de filtro con BigQuery, primero debes exportar los metadatos de tu almacén DICOM a BigQuery. Los metadatos exportados muestran los UIDs del estudio, la serie y la instancia de los datos DICOM de tu almacén DICOM.

Después de exportar los metadatos, sigue estos pasos:

  1. Ejecuta una consulta para obtener los UIDs del estudio, la serie y las instancias que quieras añadir al archivo de filtro.

    Por ejemplo, la siguiente consulta muestra cómo concatenar los UIDs de estudio, serie e instancia para cumplir los requisitos del formato de archivo de filtro:

    SELECT CONCAT
        ('/studies/', StudyInstanceUID, '/series/', SeriesInstanceUID, '/instances/', SOPInstanceUID)
    FROM
        [PROJECT_ID:BIGQUERY_DATASET.BIGQUERY_TABLE]
  2. Opcional: Si la consulta devuelve un conjunto de resultados grande que supera el tamaño máximo de respuesta, guarda los resultados de la consulta en una nueva tabla de destino en BigQuery.

  3. Guarda los resultados de la consulta en un archivo y expórtalo a Cloud Storage. Si has guardado los resultados de la consulta en una tabla de destino nueva en el paso 2, consulta Exportar datos de tablas para exportar el contenido de la tabla a Cloud Storage.

  4. Edita el archivo exportado según sea necesario e inclúyelo en tu solicitud para cambiar la clase de almacenamiento de varios objetos DICOM.

Crear un archivo de filtro manualmente

Para crear un archivo de filtro manualmente, siga estos pasos:

  1. Crea un archivo de filtro que contenga los objetos DICOM por los que quieres filtrar.
  2. Sube el archivo de filtro a Cloud Storage. Para obtener instrucciones, consulta Subir objetos desde un sistema de archivos.

Pase en el archivo de filtro

Después de crear un archivo de filtro, llama a la operación de exportación de DICOM y envía el archivo de filtro mediante la API REST. En los siguientes ejemplos se muestra cómo exportar datos DICOM mediante un filtro.

gcloud

Para exportar metadatos DICOM a Cloud Storage mediante un filtro, usa el comando gcloud beta healthcare dicom-stores export gcs:

gcloud beta healthcare dicom-stores export gcs DICOM_STORE_ID \
  --dataset=DATASET_ID \
  --location=LOCATION \
  --gcs-uri-prefix=gs://DESTINATION_BUCKET/DIRECTORY \
  --filter-config-gcs-uri=gs://BUCKET/DIRECTORY/FILTER_FILE

Haz los cambios siguientes:

  • DICOM_STORE_ID: el identificador del almacén DICOM
  • DATASET_ID: el nombre del conjunto de datos superior del almacén DICOM
  • LOCATION: la ubicación del conjunto de datos superior del almacén DICOM
  • DESTINATION_BUCKET/DIRECTORY: el segmento de Cloud Storage de destino
  • BUCKET/DIRECTORY/FILTER_FILE: la ubicación del archivo de filtro en un segmento de Cloud Storage

El resultado es el siguiente:

Request issued for: [DICOM_STORE_ID]
Waiting for operation [projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID] to complete...done.
name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID

Para ver el estado de la operación, ejecuta el comando gcloud healthcare operations describe y proporciona OPERATION_ID de la respuesta:

gcloud healthcare operations describe OPERATION_ID \
  --location=LOCATION \
  --dataset=DATASET_ID

Haz los cambios siguientes:

  • OPERATION_ID: el número de ID devuelto en la respuesta anterior.
  • DATASET_ID: el nombre del conjunto de datos superior del almacén DICOM
  • LOCATION: la ubicación del conjunto de datos superior del almacén DICOM

El resultado es el siguiente:

done: true
metadata:
'@type': type.googleapis.com/google.cloud.healthcare.v1beta1.OperationMetadata
apiMethodName: google.cloud.healthcare.v1beta1.dicom.DicomService.ExportDicomData
counter:
  success: SUCCESSFUL_INSTANCES
  failure: FAILED_INSTANCES
createTime: 'CREATE_TIME'
endTime: 'END_TIME'
logsUrl: 'https://console.cloud.google.com/logs/query/CLOUD_LOGGING_URL'
name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID
response:
'@type': '...'

API

Para exportar datos DICOM mediante un filtro, usa el método projects.locations.datasets.dicomStores.export.

curl

Para exportar datos DICOM mediante un archivo de filtro, haz una solicitud POST y proporciona la siguiente información:

  • Nombre y ubicación del conjunto de datos principal
  • Nombre del almacén DICOM
  • El segmento de destino de Cloud Storage
  • Ubicación del archivo de filtro en un segmento de Cloud Storage

En el siguiente ejemplo se muestra una solicitud POST que utiliza curl.

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/json; charset=utf-8" \
    --data "{
      'gcsDestination': {
        'uriPrefix': 'gs://BUCKET/DIRECTORY'
      },
      'filterConfig': {
        'resourcePathsGcsUri': 'gs://BUCKET/DIRECTORY/FILTER_FILE'
      }
    }" "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/REGION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID:export"

Si la solicitud se realiza correctamente, el servidor devuelve la siguiente respuesta en formato JSON:

{
  "name": "projects/PROJECT_ID/locations/REGION/datasets/DATASET_ID/operations/OPERATION_ID"
}

La respuesta contiene un nombre de operación. Usa el método Operation get para hacer un seguimiento del estado de la operación:

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/REGION/datasets/DATASET_ID/operations/OPERATION_NAME"

Si la solicitud se realiza correctamente, el servidor devuelve la siguiente respuesta en formato JSON:

{
  "name": "projects/PROJECT_ID/locations/REGION/datasets/DATASET_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1beta1.dicom.DicomService.ExportDicomData",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME"
  },
  "done": true,
  "response": {
    "@type": "..."
  }
}

PowerShell

Para exportar datos DICOM mediante un archivo de filtro, haz una solicitud POST y proporciona la siguiente información:

  • Nombre y ubicación del conjunto de datos principal
  • Nombre del almacén DICOM
  • El segmento de destino de Cloud Storage
  • Ubicación del archivo de filtro en un segmento de Cloud Storage

En el siguiente ejemplo se muestra una solicitud POST que utiliza Windows PowerShell.

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred" }

Invoke-WebRequest `
  -Method Post `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body "{
    'gcsDestination': {
      'uriPrefix': 'gs://BUCKET/DIRECTORY'
    },
    'filterConfig': {
      'resourcePathsGcsUri': 'gs://BUCKET/DIRECTORY/FILTER_FILE'
  }" `
  -Uri "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/REGION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID:export" | Select-Object -Expand Content

Si la solicitud se realiza correctamente, el servidor devuelve la siguiente respuesta en formato JSON:

{
  "name": "projects/PROJECT_ID/locations/REGION/datasets/DATASET_ID/operations/OPERATION_ID"
}

La respuesta contiene un nombre de operación. Usa el método Operation get para hacer un seguimiento del estado de la operación:

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred" }

Invoke-WebRequest `
  -Method Get `
  -Headers $headers `
  -Uri "https://healthcare.googleapis.com/v1beta1/projects/PROJECT_ID/locations/REGION/datasets/DATASET_ID/operations/OPERATION_NAME" | Select-Object -Expand Content

Si la solicitud se realiza de forma correcta, el servidor devuelve la siguiente respuesta con el estado de la operación en formato JSON:

{
  "name": "projects/PROJECT_ID/locations/REGION/datasets/DATASET_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.healthcare.v1beta1.OperationMetadata",
    "apiMethodName": "google.cloud.healthcare.v1beta1.dicom.DicomService.ExportDicomData",
    "createTime": "CREATE_TIME",
    "endTime": "END_TIME"
  },
  "done": true,
  "response": {
    "@type": "..."
  }
}

Solucionar problemas con las solicitudes de exportación de DICOM

Si se producen errores durante una solicitud de exportación de DICOM, se registran en Cloud Logging. Para obtener más información, consulta Ver registros de errores en Cloud Logging.

Si toda la operación devuelve un error, consulta Solucionar problemas de operaciones de larga duración.