Transcodifica archivos comprimidos en gzip

En esta página, se trata la conversión de archivos hacia y desde el estado comprimido en gzip. En esta página, se incluyen una descripción general de transcodificación, recomendaciones para trabajar con metadatos asociados y el comportamiento de archivos comprimidos en Cloud Storage.

Transcodificación y gzip

gzip es una forma de compresión de datos: reduce el tamaño de un archivo de forma típica. Esto permite que el archivo se pueda transferir más rápido y se pueda almacenar con menos uso de espacio que si no estuviera comprimido. Comprimir un archivo puede reducir costos y el tiempo de transferencia. La transcodificación, en Cloud Storage, es el cambio automático de la compresión de un archivo antes de que se entregue a un solicitante. Cuando la transcodificación da como resultado un archivo comprimido en gzip, se puede considerar compresiva, mientras que si el resultado es un archivo que ya no está comprimido en gzip, se la puede considerar descompresiva. Cloud Storage es compatible con la forma descompresiva de la transcodificación.

Transcodificación descompresiva

Si los archivos se almacenan como objetos comprimidos en gzip en Cloud Storage, se pueden descomprimir automáticamente antes de que se envíen a un solicitante, lo que da como resultado un archivo con identidad codificada (es decir, no comprimido). Esto permite la reducción de costos de almacenamiento para el objeto dentro de Cloud Storage, pero le da al solicitante el archivo en sí, sin compresión. Esto es útil, por ejemplo, cuando se entregan archivos a los clientes.

A fin de ser elegible para la transcodificación descompresiva, un objeto debe cumplir con los dos criterios siguientes:

  1. El archivo está comprimido en gzip cuando se almacena en Cloud Storage.

  2. Los metadatos asociados incluyen Content-Encoding: gzip.

Cuando un objeto cumple con estos dos criterios, se somete a una transcodificación descompresiva cuando se solicita, en cuyo caso también se entrega sin un encabezado Content-Encoding. Si quieres que un objeto que cumple con los dos criterios se entregue en su estado comprimido (por ejemplo, a fin de acortar el tiempo o reducir los costos de salida), hay dos formas de evitar que ocurra una transcodificación descompresiva:

  • Si la solicitud del objeto incluye un encabezado Accept-Encoding: gzip, el objeto se entrega como aparece en esa solicitud específica, junto con un encabezado de respuesta Content-Encoding: gzip.

  • Si el campo de metadatos Cache-Control del objeto está establecido en no-transform, se entrega como un objeto comprimido en todas las solicitudes posteriores, sin importar si hay encabezados de solicitud Accept-Encoding.

Tipo del contenido y codificación del contenido

Hay varios comportamientos que debes tener en cuenta acerca de la relación de Content-Type y Content-Encoding con la transcodificación. Ambos son metadatos almacenados junto con un objeto. Consulta Visualiza y edita los metadatos de objetos a fin de obtener instrucciones detalladas para agregar metadatos a objetos.

Content-Type indica el tipo de objeto que se sube y debe incluirse en todas las cargas. Por ejemplo:

Content-Type: text/plain

indica que el objeto subido es un archivo de texto sin formato. Aunque no hay ninguna verificación para garantizar que el Content-Type especificado coincida con la verdadera naturaleza de un objeto subido, la especificación incorrecta de su tipo en el mejor de los casos hará que los solicitantes reciban algo diferente de lo que esperaban y podría conducir a comportamientos no deseados.

Content-Encoding es opcional y, si lo deseas, puede incluirse en la carga de archivos comprimidos. Por ejemplo:

Content-Encoding: gzip

indica que el objeto subido está comprimido en gzip. Al igual que con Content-Type, no hay ninguna verificación para garantizar que el Content-Encoding especificado se aplique en realidad al objeto subido, y la especificación incorrecta de la codificación de un objeto podría conducir a un comportamiento no deseado en las solicitudes de descarga posteriores.

Recomendaciones

  • Cuando se sube un objeto comprimido en gzip, la forma recomendada de configurar tus metadatos es especificar Content-Type y Content-Encoding. Por ejemplo, para un archivo de texto sin formato comprimido, esta sería la forma recomendada:

    Content-Type: text/plain
    Content-Encoding: gzip
    

    Esto brinda la mayor cantidad de información sobre el estado del objeto a cualquiera que acceda a él. Esto también hace que el objeto sea elegible para la transcodificación descompresiva cuando se descargue más tarde, lo que permite que las aplicaciones cliente manejen la semántica de Content-Type de forma correcta.

  • Como alternativa, puedes subir el objeto con Content-Type establecido para indicar compresión y sin NINGÚN Content-Encoding. Por ejemplo:

    Content-Type: application/gzip
    

    De todas formas, en este caso lo único que se sabe de inmediato sobre el objeto es que está comprimido en gzip, sin información sobre el tipo de objeto subyacente. Además, el objeto no es elegible para la transcodificación descompresiva.

Prácticas no recomendadas

  • A pesar de que es posible hacerlo, no se debe subir un archivo comprimido en gzip sin indicar la naturaleza comprimida del archivo. Por ejemplo, para un archivo de texto sin formato comprimido en gzip, debes evitar configurar solo Content-Type: text/plain. Hacer eso tergiversa el estado del objeto que se entregará a un solicitante.

  • Del mismo modo, los objetos no deben subirse con un Content-Type omitido, incluso si se incluye un Content-Encoding. Si lo haces, es posible que Content-Type se establezca en un valor predeterminado, pero que se rechace la solicitud, según cómo se realice la carga.

Prácticas incorrectas

  • No debes configurar tus metadatos para que informen de forma redundante la compresión del objeto:

    Content-Type: application/gzip
    Content-Encoding: gzip
    

    Esto implica que lo que subes es un objeto comprimido en gzip que se volvió a comprimir en gzip una segunda vez, aunque ese no es el caso típico (si en realidad quieres comprimir un archivo dos veces, consulta la sección sobre el uso de gzip en objetos comprimidos a continuación). Cuando la transcodificación descompresiva se realiza sobre un objeto informado de forma incorrecta, este se entrega con la identidad codificada, pero los solicitantes creerán que recibieron un objeto que aún tiene una capa de compresión asociada. Los intentos de descomprimir el objeto fallarán.

  • Del mismo modo, un archivo que no esté comprimido en gzip no debe subirse con Content-Encoding: gzip. Si haces eso, el objeto parecerá elegible para la transcodificación, pero, cuando se lo solicite, los intentos de transcodificación fallarán.

Usa gzip en objetos comprimidos

Algunos objetos, como muchos archivos de imagen, video y audio, sin mencionar a los archivos gzip en sí, ya se encuentran comprimidos. Usar gzip en esos objetos ofrece casi ningún beneficio: en la mayoría de los casos, hacerlo agranda el objeto debido a la sobrecarga de gzip. Por este motivo, no se suele recomendar que uses gzip en contenido comprimido, ya que, además, podría causar comportamientos no deseados.

Por ejemplo, aunque Cloud Storage permite que se suban y almacenen objetos “con doble compresión” (es decir, objetos que están comprimidos en gzip, pero también tienen un tipo de contenido subyacente comprimido), no permite que se entreguen objetos en un estado con doble compresión, a menos que sus metadatos Cache-Control incluyan no-transform. En su lugar, quita el nivel de compresión externo, gzip, descarta el encabezado de respuesta Content-Encoding y entrega el objeto resultante. Esto ocurre incluso para solicitudes con Accept-Encoding: gzip.

Usa el encabezado Range

Cuando se realiza la transcodificación, si la solicitud del objeto incluye un encabezado Range, este se ignora de forma silenciosa. Esto significa que las solicitudes de contenido parcial no se llevan a cabo y la respuesta, en su lugar, entrega el objeto solicitado completo. Por ejemplo, si tienes un objeto de 10 GB elegible para la transcodificación, pero incluyes el encabezado Range: bytes=0-10000 en la solicitud, recibirás el objeto de 10 GB completo.

Este comportamiento surge porque no es posible seleccionar un rango de un archivo comprimido sin descomprimir el archivo primero en su totalidad: cada solicitud de una parte del archivo estaría acompañada de la descompresión completa de un archivo que podría ser grande, lo cual sería un desperdicio de recursos. Debes tener en cuenta este comportamiento y evitar usar el encabezado Range cuando uses la transcodificación, ya que se generan cargos por la transmisión de todo el objeto, no solo del rango solicitado. Si deseas obtener más información sobre el comportamiento de respuesta permitido para las solicitudes con encabezados Range, consulta la especificación.

Si se necesitan solicitudes con encabezados Range, debes asegurarte de que no se realice la transcodificación para el objeto solicitado. Para lograr esto, selecciona las propiedades adecuadas cuando subas objetos. Por ejemplo, las solicitudes de rango para objetos con Content-Type: application/gzip y sin Content-Encoding se realizan según lo solicitado.

Próximos pasos

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

¿Necesitas ayuda? Visita nuestra página de asistencia.