# Guardar los archivos resultantes

## Ejemplo de Assembly Status JSON

Veamos el [Assembly Status JSON](/docs/api/assembly-status-response.md) completo que recibirías después de que procesáramos el cambio de tamaño de la imagen de[Mi primera aplicación](/es/docs/getting-started/my-first-app.md):

![](/_next/static/media/copy.04p1cju9qekk_.svg?dpl=dpl_6eiBuj4xKF4BavafxaGyWDmoxdxA)

```json
{
  "assembly_id": "7828446e5acd4aa996dce3455ec914e9",
  "ok": "ASSEMBLY_COMPLETED",
  "message": "The Assembly was successfully completed.",
  "warnings": [],
  "account_id": "4ce4fb3d9d1842b6ba5d6f3ccee4b066",
  "assembly_ssl_url": "https://api2-jenks.transloadit.com/assemblies/7828446e5acd4aa996dce3455ec914e9",
  "assembly_url": "http://api2.jenks.transloadit.com/assemblies/7828446e5acd4aa996dce3455ec914e9",
  "build_id": "339",
  "bytes_expected": 486608,
  "bytes_received": 486608,
  "bytes_usage": 1097155,
  "client_agent": null,
  "client_ip": null,
  "client_referer": null,
  "companion_url": "https://api2-jenks.transloadit.com/companion/",
  "executing_jobs": [],
  "execution_duration": 5.281,
  "execution_start": "2020/01/09 12:02:08 GMT",
  "expected_tus_uploads": 1,
  "fields": {},
  "finished_tus_uploads": 1,
  "has_dupe_jobs": false,
  "instance": "jenks.transloadit.com",
  "is_infinite": false,
  "jobs_queue_duration": 0.01,
  "last_job_completed": "2020/01/09 12:02:14 GMT",
  "merged_params": "{\"steps\":{\":original\":{\"robot\":\"/upload/handle\"},\"faces_detected\":{\"use\":\":original\",\"robot\":\"/image/facedetect\",\"crop\":true,\"faces\":\"max-confidence\",\"format\":\"preserve\",\"crop_padding\":\"10%\"},\"exported\":{\"use\":[\"faces_detected\",\":original\"],\"robot\":\"/s3/store\",\"credentials\":\"demo_s3_credentials\"}},\"auth\":{\"key\":\"****\",\"expires\":\"2020-01-10T12:02:05.826Z\"}}",
  "notify_duration": null,
  "notify_response_code": null,
  "notify_start": null,
  "notify_status": null,
  "notify_url": null,
  "params": "{\"steps\":{\":original\":{\"robot\":\"/upload/handle\"},\"faces_detected\":{\"use\":\":original\",\"robot\":\"/image/facedetect\",\"crop\":true,\"faces\":\"max-confidence\",\"format\":\"preserve\",\"crop_padding\":\"10%\"},\"exported\":{\"use\":[\"faces_detected\",\":original\"],\"robot\":\"/s3/store\",\"credentials\":\"demo_s3_credentials\"}},\"auth\":{\"key\":\"****\",\"expires\":\"2020-01-10T12:02:05.826Z\"}}",
  "parent_assembly_status": null,
  "parent_id": null,
  "queue_duration": 0.184,
  "running_jobs": [],
  "start_date": "2020/01/09 12:02:06 GMT",
  "started_jobs": [
    ":original:::original",
    "faces_detected:::original",
    "exported:::original",
    "exported::faces_detected"
  ],
  "started_tus_uploads": 1,
  "template": null,
  "template_id": null,
  "transloadit_client": "node-sdk:2.0.8",
  "tus_url": "https://api2-jenks.transloadit.com/resumable/files/",
  "upload_duration": 2.814,
  "upload_meta_data_extracted": true,
  "uppyserver_url": "https://api2-jenks.transloadit.com/companion/",
  "websocket_url": "https://api2-jenks.transloadit.com/ws20074",
  "uploads": [
    {
      "id": "a30bd0776e7f4ac3817b056d102e8219",
      "basename": "joe-gardner-149699",
      "ext": "jpg",
      "field": "file",
      "from_batch_import": false,
      "is_tus_file": true,
      "md5hash": "fb205cb04b6998fe7ba364f70227cfa1",
      "mime": "image/jpeg",
      "name": "joe-gardner-149699.jpg",
      "original_basename": "joe-gardner-149699",
      "original_id": "a30bd0776e7f4ac3817b056d102e8219",
      "original_md5hash": "fb205cb04b6998fe7ba364f70227cfa1",
      "original_name": "joe-gardner-149699.jpg",
      "original_path": "/",
      "size": 485784,
      "ssl_url": "https://s3.amazonaws.com/demos.transloadit.com/a3/0bd0776e7f4ac3817b056d102e8219/joe-gardner-149699.jpg",
      "tus_upload_url": "https://api2-jenks.transloadit.com/resumable/files/f95ba7eebf22e0ebadcf9b09a3a91c65+DRCJv78IeFDneTwnYb3pagc8Bqg7IwlRAFpW8e3i.f4RSPIZXEeaxdheZiTBBvJ0pAyjxL3.U5TvUqWytvkObgz6Bh55biPZwLqzIK_mwRbjGl0UREMrju1zfy8.OgTg",
      "type": "image",
      "url": "http://demos.transloadit.com.s3.amazonaws.com/a3/0bd0776e7f4ac3817b056d102e8219/joe-gardner-149699.jpg",
      "meta": {
        "aspect_ratio": "1.500",
        "average_color": "#b09d96",
        "colorspace": "RGB",
        "date_file_modified": "2020/01/09 12:02:08 GMT",
        "frame_count": 1,
        "has_clipping_path": false,
        "has_transparency": false,
        "height": 1667,
        "width": 2500
      }
    }
  ],
  "results": {
    ":original": [
      {
        "id": "a30bd0776e7f4ac3817b056d102e8219",
        "basename": "joe-gardner-149699",
        "cost": 97157,
        "execTime": 0.81,
        "ext": "jpg",
        "field": "file",
        "from_batch_import": false,
        "is_tus_file": false,
        "md5hash": "fb205cb04b6998fe7ba364f70227cfa1",
        "mime": "image/jpeg",
        "name": "joe-gardner-149699.jpg",
        "original_basename": "joe-gardner-149699",
        "original_id": "a30bd0776e7f4ac3817b056d102e8219",
        "original_md5hash": "fb205cb04b6998fe7ba364f70227cfa1",
        "original_name": "joe-gardner-149699.jpg",
        "original_path": "/",
        "queue": "live",
        "queueTime": 0.01,
        "size": 485784,
        "ssl_url": "https://s3.amazonaws.com/demos.transloadit.com/a3/0bd0776e7f4ac3817b056d102e8219/joe-gardner-149699.jpg",
        "tus_upload_url": null,
        "type": "image",
        "url": "http://demos.transloadit.com.s3.amazonaws.com/a3/0bd0776e7f4ac3817b056d102e8219/joe-gardner-149699.jpg",
        "meta": {
          "aspect_ratio": "1.500",
          "average_color": "#b09d96",
          "colorspace": "RGB",
          "date_file_modified": "2020/01/09 12:02:08 GMT",
          "frame_count": 1,
          "has_clipping_path": false,
          "has_transparency": false,
          "height": 1667,
          "width": 2500
        }
      }
    ],
    "faces_detected": [
      {
        "id": "b8d12f6c517541ca86bf50c537cedb27",
        "basename": "joe-gardner-149699",
        "cost": 627606,
        "execTime": 0.83,
        "ext": "jpg",
        "field": "file",
        "from_batch_import": false,
        "is_tus_file": false,
        "md5hash": "2a5cd917f4281b9438956e489c63dfd2",
        "mime": "image/jpeg",
        "name": "joe-gardner-149699.jpg",
        "original_basename": "joe-gardner-149699",
        "original_id": "a30bd0776e7f4ac3817b056d102e8219",
        "original_md5hash": "fb205cb04b6998fe7ba364f70227cfa1",
        "original_name": "joe-gardner-149699.jpg",
        "original_path": "/",
        "queue": "live",
        "queueTime": 0,
        "size": 141822,
        "ssl_url": "https://s3.amazonaws.com/demos.transloadit.com/b8/d12f6c517541ca86bf50c537cedb27/joe-gardner-149699.jpg",
        "tus_upload_url": null,
        "type": "image",
        "url": "http://demos.transloadit.com.s3.amazonaws.com/b8/d12f6c517541ca86bf50c537cedb27/joe-gardner-149699.jpg",
        "meta": {
          "aspect_ratio": "0.739",
          "average_color": "#8d654d",
          "colorspace": "RGB",
          "date_file_created": "2020/01/09 12:02:09 GMT",
          "date_file_modified": "2020/01/09 12:02:12 GMT",
          "faces": [
            {
              "confidence": 99.99,
              "height": 840,
              "width": 621,
              "x1": 981,
              "x2": 1550,
              "y1": 121,
              "y2": 891
            }
          ],
          "frame_count": 1,
          "has_clipping_path": false,
          "has_transparency": false,
          "height": 840,
          "width": 621
        }
      }
    ]
  }
}

```

Como puedes ver, Transloadit proporciona las ubicaciones finales y los metadatos de:

* **todos los archivos subidos**: al final, en la clave `uploads`
* **todos los archivos resultantes generados**: en la clave `results`

Cada objeto de archivo contiene metadatos, además de una `ssl_url` que apunta al resultado. Si utilizaste uno de nuestros [Robots de exportación](/docs/robots.md#service-file-exporting/), estas ubicaciones reflejarán el almacenamiento que especificaste, como tu bucket de S3. De lo contrario, la ubicación será una URL temporal que se **eliminará después de [24 horas](/docs/faq/temporary-purge.md)**.

###### Advertencia

Las URL temporales solo sirven para descargar los archivos una vez en tu propio almacenamiento. Nunca compartas estas URL con usuarios finales ni las uses en producción. Consulta las [restricciones del almacenamiento temporal](/docs/faq/temporary-purge.md)para conocer las limitaciones de uso importantes.

Según tu integración, puedes optar por:

* Procesar los resultados localmente donde realizas la solicitud,
* Hacer que los resultados se [agreguen a un formulario y se envíen a tu backend](https://uppy.io/docs/transloadit/), o
* (Con Async Mode) hacer que Transloadit envíe el[Assembly Status JSON](/docs/api/assembly-status-response.md) a tu `notify_url`, que luego puedes usar para guardar registros en tu base de datos.

Hay un ejemplo de esto en la [página de webhooks](/docs/topics/webhooks.md).

## Mostrar los archivos resultantes a tus usuarios finales

Después de guardar los archivos en almacenamiento persistente y los metadatos útiles para tu aplicación en tu base de datos, puedes entregárselos a tus usuarios. En nuestro caso, mostraremos la imagen recortada así:

![](/_next/static/media/copy.04p1cju9qekk_.svg?dpl=dpl_6eiBuj4xKF4BavafxaGyWDmoxdxA)

```html
<img
  alt="avatar"
  src="https://s3.amazonaws.com/demos.transloadit.com/7b/22df50590d11e8be51b7c2c7cc7e22/joe-gardner-149699.jpg"
/>

```

Si trabajaras con video, podrías considerar reproductores como[HLS.js](https://github.com/video-dev/hls.js), [Plyr](https://plyr.io/) o[indigo-player](https://matvp91.github.io/indigo-player/#/), que también son compatibles con[streaming HTTP en vivo](/docs/robots/video-adaptive.md) y[MPEG-DASH](/docs/robots/video-adaptive.md).

## Al guardar los resultados del procesamiento de archivos, no dependas de su orden

Cuando los resultados de encoding estén listos y Transloadit haga una solicitud POST a la URL de resultados o a la URL deAssembly Notification, no dependas del orden de los resultados.

Imagina que tienes dos Steps del Robot[🤖/image/resize](/docs/robots/image-resize.md) en tuTemplate que aplican `use` al Step `:original`, así:

![](/_next/static/media/copy.04p1cju9qekk_.svg?dpl=dpl_6eiBuj4xKF4BavafxaGyWDmoxdxA)

```json
{
  "steps": {
    "high": {
      "use": ":original",
      "robot": "/image/resize",
      "width": 500,
      "height": 500
    },
    "low": {
      "use": ":original",
      "robot": "/image/resize",
      "width": 200,
      "height": 200
    }
  }
}

```

Cuando subes 30 fotos con este Template, el JSON de laAssembly resultante contiene dos arreglos de resultados:`"results" -> "high"` y `"results" -> "low"`. Sin embargo, el orden de las imágenes dentro de estos arreglos no es el mismo. El primer resultado de `"high"` podría derivarse de la decimoquinta foto subida, mientras que el primer resultado del arreglo `"low"` podría derivarse de la décima foto subida.

Si necesitas asociar los resultados de encoding con sus uploads correspondientes —y probablemente sea así—, hazlo mediante la propiedad `id` de las entradas del arreglo `"uploads"` y la propiedad `original_id` de las entradas de los distintos arreglos de resultados.

## Almacena los archivos subidos originalmente

Almacenar no solo los archivos resultantes del encoding, sino también los archivos que tus usuarios subieron originalmente, te permite volver a procesarlos más adelante en distintos formatos a medida que cambien tus requisitos. Si no los almacenas, se perderán para siempre, porque probablemente no sea viable pedirles a tus usuarios que vuelvan a subirlos.

## Almacena todos los metadatos necesarios

Además de lo anterior, ten en cuenta que las Assemblies son efímeras. Transloadit elimina los registros después de **90 días**, por lo que, si quieres conservar los metadatos que contienen, deberías importarlos a tu sistema de almacenamiento de datos.
